几天前我得到了同样的结果..因此我将正则表达式更改为如下所示:
fastcgi_split_path_info ^(.+\.php)(/.*)$;
并添加了一个视图其他行,使其最有可能在 Apache 上工作。
这是我对文件 fastcgi_params
所做的全部差异
@@ -3,13 +3,22 @@
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
-fastcgi_param SCRIPT_FILENAME $request_filename;
+#fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
+fastcgi_split_path_info ^(.+\.php)(/.*)$;
+fastcgi_param PATH_INFO $fastcgi_path_info;
+set $path_translated "";
+if ($fastcgi_path_info) {
+ set $path_translated $document_root$fastcgi_path_info;
+}
+fastcgi_param PATH_TRANSLATED $path_translated;
+fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
使用此配置,您始终拥有 PATH_INFO 变量,而不是它在 f.e. 中的完成方式。阿帕奇。
我使用的一些脚本只是像这样检查了哪些(当然)不适用于我的配置:
if (!isset($_SERVER['PATH_INFO']) { doSomething() }
我建议主开发者将其更改为:
if (!isset($_SERVER['PATH_INFO'] || empty($_SERVER['PATH_INFO']) { doSomething() }
如果你想看看我的完整服务器配置,只需看看这个 github-repository:
https://github.com/SimonSimCity/webserver-configuration/
编辑:我找到了一个解决方案略有不同的博客。我还没有测试它,但它似乎有点小;)
http://www.jzxue.com/fuwuqi/http-iis-apache/201108/19-8538.html
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;