之前在网上找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报错。
附可用的配置方法:
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. 的错误。