PHP cgi.fix_pathinfo=1 的作用从来没有被说明白。在 php.ini 及 PHP 文档中,它被描述得让人费解,而且这种描述完全没有讲到点上。- ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
- ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
- ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
- ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
- ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
- ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
- ; https://php.net/cgi.fix-pathinfo
复制代码 cgi.fix_pathinfo=1 真正的意思是:如果 SCRIPT_FILENAME 指定的文件不存在,PHP 会逐层向上一层测试文件是否存在,哪一层的文件存在就把那一层的文件当成 PHP 脚本文件执行并且重新计算 $_SERVER['PATH_INFO'],而不是直接使用最初的 PATH_INFO。如果最终没有找到一个存在的文件,PHP 给出“No input file specified.”的响应。
cgi.fix_pathinfo=0 时,PHP 只测试 SCRIPT_FILENAME 本身,只要这个文件不存在就直接给出“No input file specified.”的响应。
需要注意的是:PHP 只检测文件是否存在,不检测文件到底有什么扩展名、是什么文件;cgi.fix_pathinfo 对 fast CGI 模式同样适用;文件夹是一种特殊的文件,PHP 会将存在的文件夹视作脚本文件不存在。
cgi.fix_pathinfo=1 是非常危险的配置,生产服务器上应该设置 cgi.fix_pathinfo=0。将 cgi.fix_pathinfo 配置为 0 并不会禁止生成 $_SERVER['PATH_INFO'],它关闭的只是 PHP 的逐层向上查找脚本文件并且执行机制。
举个例子:如果 php-cgi 最终拿到的 SCRIPT_FILENAME 是 C:\wuxiancheng.cn\a.jpg\b.png\c.php,而 c.php 不存在时,PHP 会按顺序去测试并且执行 b.png 和 a.jpg,找到存在的文件后就不再向上查找,找不到任何存在的文件就给出“No input file specified.”的响应。 |
|