phpEnv的Nginx默认不支持PathInfo,需手动修改Nginx配置为location ~ .php(.*)$并添加fastcgi_param PATH_INFO $1,同时确保php.ini中cgi.fix_pathinfo=1且重启服务。

phpEnv 本身不是框架,而是一个 Windows 下的 PHP 集成环境(类似 XAMPP、WampServer),它默认用 Apache,但支持切换为 Nginx。当你在 phpEnv 中启用 Nginx 并运行 ThinkPHP、CodeIgniter 等依赖 PATH_INFO 的 PHP 框架时,会发现 $_SERVER['PATH_INFO'] 始终为空——这不是框架问题,是 Nginx 配置没把路径片段正确传给 PHP。
直接结论:**phpEnv 的 Nginx 默认配置不支持 PathInfo,必须手动修改其 Nginx 配置文件并重启服务,且需同步确认 PHP 的 cgi.fix_pathinfo 开启**。
确认 php.ini 中 cgi.fix_pathinfo 是否生效
PathInfo 能否被 PHP 接收,底层依赖 CGI 协议规范,而 cgi.fix_pathinfo 控制 PHP 如何解析请求路径:
- 若值为
0(或Off),PHP 会严格校验SCRIPT_FILENAME对应文件是否存在,导致/index.php/a/b/c这类请求直接 404(因为/index.php/a/b/c显然不是真实文件) - 若值为
1(或On),PHP 才允许从请求 URI 中剥离出PATH_INFO并注入$_SERVER
在 phpEnv 中找到对应 PHP 版本的 php.ini(通常位于 phpEnv\php\版本号\php.ini),搜索并确保这一行未被注释且值为 1:
cgi.fix_pathinfo = 1
改完后必须重启 phpEnv 的 PHP-FPM(或整个服务),否则不生效。
修改 phpEnv 内置 Nginx 的 location ~ \.php 块
phpEnv 的 Nginx 配置文件一般在 phpEnv\nginx\conf\vhost\*.conf 或主配置 phpEnv\nginx\conf\nginx.conf 的 server 块内。找到类似这样的原始配置:
立即学习“PHP免费学习笔记(深入)”;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
关键问题就出在正则末尾的 $ 和缺失 PATH_INFO 提取逻辑。改成以下内容(仅需两处改动):
- 把
location ~ \.php$改为location ~ \.php(.*)$(允许匹配.php后的任意路径) - 在
include fastcgi_params;前添加:fastcgi_param PATH_INFO $1;
完整示例:
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $1;
include fastcgi_params;
}
⚠️ 注意:$1 是正则捕获组,只在 ~ \.php(.*)$ 这种写法下有效;若用 ~ \.php(无括号无 $),$1 为空,PATH_INFO 就传不进去。
避免 fastcgi_split_path_info 的兼容性陷阱
有些教程推荐用 fastcgi_split_path_info 指令配合正则提取 PATH_INFO,例如:
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
这在主流 Nginx 版本(1.10+)可用,但 phpEnv 自带的 Nginx 版本较旧(常见为 1.16 以下),fastcgi_split_path_info 可能未编译启用,或行为不稳定。实测中容易出现 $fastcgi_path_info 为空、甚至触发 502 错误。
更稳妥的做法就是上一节的 ~ \.php(.*)$ + $1 方案——它不依赖额外指令,兼容所有 Nginx 版本,且逻辑直白。
验证 PATH_INFO 是否真正可用
别只信 phpinfo() 页面里是否显示 PATH_INFO。真实框架运行时,常因重写规则干扰导致 PATH_INFO 被覆盖或清空。最准的验证方式是写一个最小测试脚本:
<?php var_dump($_SERVER['PATH_INFO'] ?? 'not set'); var_dump($_SERVER['REQUEST_URI'] ?? ''); ?>
访问 http://localhost/test.php/a/b/c?d=1,预期输出:
string(5) "/a/b/c" string(18) "/test.php/a/b/c?d=1"
如果 PATH_INFO 是 not set 或空字符串,说明 Nginx 没传过去;如果是 "/test.php/a/b/c",说明正则没截对(可能漏了 ^ 或用了错误的捕获组)。
PATH_INFO 环境变量”,没有魔法。但 phpEnv 的封装会让路径查找和配置层级变深,稍不注意就改错文件、忘重启服务、或混淆了 Apache 和 Nginx 的配置位置——动手前先确认你编辑的是当前启用的 Nginx 配置,而不是某个被注释掉的备份块。



















