Nginx下ThinkPHP的Pathinfo URL无法解析时,需配置PATH_INFO传递:一、启用fastcgi_split_path_info并注入参数;二、用set+if手动分离;三、开启PHP的cgi.fix_pathinfo=1;四、try_files+rewrite隐藏入口;五、引入pathinfo.conf复用配置。

如果您在Nginx环境下运行ThinkPHP应用,但发现类似 /index.php/admin/user/list 的Pathinfo格式URL无法正确解析路由或返回404错误,则很可能是Nginx未正确识别并传递PATH_INFO环境变量。以下是多种经实测有效的配置方法:
一、启用fastcgi_split_path_info并注入PATH_INFO参数
该方法适用于Nginx 0.7.31及以上版本,通过正则拆分请求URI,显式提取并设置PATH_INFO,是官方推荐的兼容性较强的方式。
1、编辑站点对应的Nginx配置文件(如 /usr/local/nginx/conf/vhost/your_domain.conf)。
2、定位到 location ~ \.php$ { } 或更宽泛的PHP匹配块(建议改用 location ~ [^/]\.php(/|$) { })。
立即学习“PHP免费学习笔记(深入)”;
3、在该块内添加以下三行关键指令:
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
4、确保已包含 fastcgi_params 或等效参数文件,并保留 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;。
5、保存后执行 nginx -t && nginx -s reload 重载配置。
二、使用set + if方式手动分离script与path_info
该方法不依赖fastcgi_split_path_info指令,在部分老旧Nginx版本或特殊路径结构下更稳定,通过变量重写实现PATH_INFO提取。
1、在PHP处理块中(如 location ~ \.php$ { }),删除原有fastcgi_pass前的所有if逻辑(如有)。
2、添加以下变量定义与条件判断:
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
3、覆盖默认SCRIPT_NAME和新增PATH_INFO参数:
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
4、确认fastcgi_pass、fastcgi_index及include fastcgi.conf均存在且有效。
5、重启Nginx服务使配置生效。
三、修改PHP配置启用cgi.fix_pathinfo
此步骤为必要前置条件,若PHP未开启路径信息解析支持,Nginx传递的PATH_INFO将被忽略。必须与上述任一Nginx配置配合使用。
1、打开PHP主配置文件 /usr/local/php/etc/php.ini(路径依实际安装而定)。
2、搜索 cgi.fix_pathinfo 配置项。
3、将其值由 0 改为 1,即: cgi.fix_pathinfo = 1。
4、保存文件后,重启PHP-FPM服务:systemctl restart php-fpm 或 service php-fpm restart。
四、配置try_files + rewrite隐藏入口并兼容Pathinfo
该方案同时解决入口文件暴露问题与Pathinfo路由识别,适用于ThinkPHP设置 'url_model' => 2(PATHINFO模式)或 3(兼容模式)的场景。
1、在server块内添加如下location块:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
2、另起一个更精确的PHP处理块,匹配带路径后缀的PHP请求:
location ~ ^(.+\.php)(/.+)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param SCRIPT_NAME $1;
fastcgi_param PATH_INFO $2;
}
3、确保index.php所在目录具有可执行权限,且ThinkPHP的public目录为root指定路径。
4、重载Nginx配置并验证URL如 /admin/user/edit/id/1 是否可正常响应。
五、引入独立pathinfo.conf复用配置
适用于LNMP一键包(如lnmp.org)或需多站点统一管理PATH_INFO行为的场景,通过外部引入方式降低重复配置风险。
1、在Nginx配置目录下创建文件:/usr/local/nginx/conf/pathinfo.conf。
2、向该文件写入标准PATH_INFO支持参数:
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
3、在各站点配置的PHP location块中,插入 include pathinfo.conf;。
4、检查所有涉及PHP处理的location是否已移除冲突的try_files或rewrite规则。
5、执行 nginx -t 验证语法,无误后重载服务。



















