nginx fastcgi 重写:主要脚本未知

nginx fastcgi 重写:主要脚本未知

我有以下 nginx 配置:

  location / {
      try_files $uri $uri/ index.html =404;

      if (!-e $request_filename) {
        rewrite ^/(.+)$ index.php?url=$1 last;
      }
  }


 location ~ .php$ {
    # protection from known vulnerability
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_index  index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 }

fastcgi_paramsDebian 软件包的默认设置)

它适用于请求/,但是当重写请求时找不到主文件:

请求/contact应该重写为/index.php?url=contact

 *104 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 10.0.0.1, server: localhost, request: "GET /contact HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "localhost:8080"

我无法从日志中获取 fastcgi 实际尝试加载的内容、哪条路径?

答案1

请注意index.php/index.php是不同的 URI。您在重写时忘记了斜线。

答案2

这是实现相同功能的更好方法:

location / {
    try_files $uri $uri/ @rewrite;
}

location @rewrite {
    rewrite ^/(.+)$ /index.php?url=$1 last;
}

然后按照您的设置中的 PHP 位置块进行操作。

try_files首先检查与 $uri 匹配的文件是否存在,然后检查目录,如果都不存在,则使用 rewrite -location 运行脚本。

您的设置无法正常工作的最可能原因是缺少/重写脚本路径。无论如何,此设置更简单,是 nginx 的首选设置。

相关内容