之前在网上找nginx配置PATH_INFO的方法,有一种是将PATH_INFO的值指定为$fastcgi_script_name,在php.ini中设置cgi.fix_pathinfo的值为1,前天在使用某款依赖PATH_INFO的框架时,果断被坑。将入口文件改为请求 http://localhost/index-dev.php时,PATH_INFO的值为 index-dev.php,框架将index-dev框架识别为controller报错。

附可用的配置方法:

1
2
3
4
5
6
7
8
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 PATH_INFO $path_info;
fastcgi_param SCRIPT_NAME $real_script_name;

几种配置方案PATH_INFO值的对比:

配置类型 请求地址 PATH_INFO PHP_SELF SCRIPT_NAME 说明
Apache /test.php /test.php /test.php Apache的值为参考
/test.php/abc/123 /abc/123 /test.php/abc/123 /test.php Apache的值为参考
nginx设置PATH_INFO和SCRIPT_NAME /test.php no value /test.php /test.php 正常
/test.php/abc/123 /abc/123 /test.php/abc/123 /test.php 正常
nginx设置PATH_INFO的值为$fastcgi_script_name /test.php /test.php /test.php/test.php /test.php PATH_INFO异常PHP_SELF异常
/test.php/abc/123 /abc/123 /test.php/abc/123 /test.php PHP_SELF异常

另外:网上所提的 cgi.fix_pathinfo 打开时的露洞已修补,cgi.fix_pathinfo的值设为0时,请求/test.php/abc/123的地址时,会报 Access denied. 的错误。