fastcgi_split_path_info用于将请求路径精准拆分为SCRIPT_FILENAME和PATH_INFO;例如访问/index.php/admin/user/list时,正确配置使SCRIPT_FILENAME指向index.php、PATH_INFO为/admin/user/list,确保框架路由正常解析。

通常不建议关掉 fastcgi_split_path_info,但是否启用取决于你的 PHP 运行模式和 URL 路由需求——它本身不是“开关型”配置,而是一个用于正确解析 PATH_INFO 的关键指令。
它到底在做什么?
这个指令让 Nginx 把请求的 SCRIPT_FILENAME 和 PATH_INFO 分开。比如访问 /index.php/admin/user/list 时:
- 没配置或配置错误 → PHP 可能收到整个路径作为脚本名,导致 404 或路由失效
- 正确配置后 →
SCRIPT_FILENAME指向/var/www/index.php,PATH_INFO是/admin/user/list,PHP 框架(如 Laravel、Symfony)才能正常解析路由
什么情况下可以不用或要调整?
如果你用的是现代部署方式,可能不需要它:
-
FPM + php-fpm.sock + try_files + fastcgi_param SCRIPT_FILENAME:很多标准配置已通过
try_files $fastcgi_script_name =404和显式设置SCRIPT_FILENAME绕过了对它的依赖 -
纯 API 或单入口无 PATH_INFO 场景:比如所有请求都走
/index.php,后端用查询参数传路由,那PATH_INFO根本没用,关了也无影响 -
用了 rewrite 显式分离路径:例如用
rewrite ^/(.*)$ /index.php?path=$1 last;,那就不再依赖 Nginx 自动拆分
关掉会出什么问题?
常见表现不是报错,而是“静默失败”:
- Laravel/Nginx 组合下,子目录路由(如
/user/123)返回 404 - WordPress 启用固定链接后,除首页外全部 404
- PHP 中
$_SERVER['PATH_INFO']为空或错乱,框架无法识别当前路由
推荐做法
保留并验证它是否生效,而不是直接关闭:
- 确认配置中存在类似
fastcgi_split_path_info ^(.+\.php)(/.+)$; - 搭配使用
fastcgi_param PATH_INFO $fastcgi_path_info; - 检查
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;是否准确(尤其注意$document_root是否拼写正确) - 临时加一行
add_header X-Path-Info $fastcgi_path_info;,用 curl 看响应头验证拆分结果
不复杂但容易忽略。留着它,配对它,测清楚它,比关掉更稳妥。











