找回密码
 新建账号

PHP cgi.fix_pathinfo=1 的真实作用

[复制链接]
 楼主| 大郎 发表于 2026-8-16 13:31 | 显示全部楼层 |阅读模式
PHP cgi.fix_pathinfo=1 的作用从来没有被说明白。在 php.ini 及 PHP 文档中,它被描述得让人费解,而且这种描述完全没有讲到点上。
  1. ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
  2. ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
  3. ; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
  4. ; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
  5. ; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
  6. ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
  7. ; 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.”的响应。

手机版|轻松e站

GMT+8, 2026-8-24 09:41

快速回复 返回顶部 返回列表