fastcgi_split_path_info是nginx中用于分离script_filename和path_info的指令,仅在正则location中生效,需配合fastcgi_param显式设置才能使php-fpm正确解析path_info。

fastcgi_split_path_info 是 Nginx 中用于正确分离 FastCGI 请求中 SCRIPT_FILENAME 和 PATH_INFO 的指令,主要用在 PHP-FPM 场景下,尤其当应用(如 Laravel、WordPress)依赖 PATH_INFO 实现路由时,必须配置准确,否则会报 404 或“No input file specified”错误。
理解它的作用和触发条件
该指令只在 location 块中使用,且仅当请求 URI 包含脚本文件(如 /index.php/some/path)时才生效。Nginx 会按正则表达式匹配 URI,提取两部分:
- 匹配到的第 1 个捕获组 → 赋给
fastcgi_script_name(即真实脚本路径) - 匹配到的第 2 个捕获组 → 赋给
fastcgi_path_info(即后续路径信息)
注意:它不会自动设置环境变量,需配合 fastcgi_param SCRIPT_FILENAME 和 fastcgi_param PATH_INFO 才能生效。
典型配置写法(PHP-FPM 常用)
以支持 /index.php/xxx 这类 PATH_INFO 请求为例:
location ~ ^(.+\.php)(/.*)?$ {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
说明:
- 正则
^(.+\.php)(/.*)$确保只对.php文件后带斜杠路径的请求做拆分 -
$fastcgi_script_name来自第 1 组,如/index.php -
$fastcgi_path_info来自第 2 组,如/admin/users -
$document_root必须存在,否则SCRIPT_FILENAME可能拼错
常见错误和排查要点
如果 PATH_INFO 不生效,优先检查以下几项:
- 正则未真正匹配到 URI —— 用
error_log /path/to/log notice;+echo $fastcgi_path_info;(需 echo 模块)或临时返回响应头验证 -
fastcgi_param PATH_INFO没有显式设置,或被后续include fastcgi_params;覆盖(因为默认fastcgi_params不含 PATH_INFO) - PHP 配置中
cgi.fix_pathinfo=1(PHP 默认值),建议设为0,避免 PHP 自行解析 path info 导致冲突 - location 使用了
=或^~前缀,导致正则不执行 ——fastcgi_split_path_info必须在正则 location 中
替代方案:不用 PATH_INFO 的更稳做法
现代 PHP 应用(如 Laravel)推荐用前端控制器模式,所有请求统一由 index.php 入口处理,不依赖 PATH_INFO:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
此时通过 $query_string 传参(如 ?url=/admin),由框架 Router 解析,更可控、无需 fastcgi_split_path_info。











