当nginx设置的PATH_INFO为空字符串时,从PHP访问它时会得到一些垃圾字符。
这是我在nginx中设置PATH_INFO的方式:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
如果路径信息有一些非空值,它可以正常工作。我甚至重新安装了nginx,但它没有帮助。 nginx版本是1.0.5(我使用的是Ubuntu 11.10,如果它很重要的话)。
答案 0 :(得分:1)
我在几天前得到了同样的观点..因此我将正则表达式改为:
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中完成的变量。的Apache。
我使用的一些脚本就是这样检查的(当然)不能用于我的配置:
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;