nginx中路径_INFO的空值返回垃圾值
当nginx设置的PATH_INFO为空字符串时,我从PHP访问它时会得到一些垃圾字符 这是我在nginx中设置路径信息的方式:nginx中路径_INFO的空值返回垃圾值,nginx,php,Nginx,Php,当nginx设置的PATH_INFO为空字符串时,我从PHP访问它时会得到一些垃圾字符 这是我在nginx中设置路径信息的方式: fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; 如果路径信息有一些非空值,它就可以正常工作。我甚至重新安装了nginx,但没有任何帮助。nginx版本是1.0.5(如果有必要的话,我正在使用Ubuntu 11.10)。几天前
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
如果路径信息有一些非空值,它就可以正常工作。我甚至重新安装了nginx,但没有任何帮助。nginx版本是1.0.5(如果有必要的话,我正在使用Ubuntu 11.10)。几天前我也看到了同样的东西。。因此,我将regexp更改为如下所示:
fastcgi_split_path_info ^(.+\.php)(/.*)$;
并在其他行中添加了一个视图,使其最有可能在Apache中工作
下面是我对文件fastcgi\u参数所做的全部区别
@@ -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存储库:
编辑:我发现一个博客的解决方案略有不同。我还没有测试过它,但它似乎有点小;)
请举例说明路径及其生成的值。当url类似于
http://localhost/myapp/index.php
,路径信息应为空,但返回垃圾邮件。当它像http://localhost/myapp/index.php/testing
,路径信息是“/测试”。当你说它返回垃圾时,你能举一个这个垃圾的例子吗?它是一些随机字符;有时是字母表,有时是像|这样的特殊字符,有时是像� ,
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;