nginx中路径_INFO的空值返回垃圾值

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)。几天前

当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)。

几天前我也看到了同样的东西。。因此,我将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;