thinkphp 5.0 在 nginx 下需正确配置 path_info:确保 php.ini 中 cgi.fix_pathinfo=1;nginx location 改为 ~ \.php(/|$);添加 fastcgi_split_path_info 提取 path_info;禁用 ?s= 伪静态规则;最后 nginx -t 并重载。

ThinkPHP 5.0 默认使用 PATH_INFO 模式解析 URL,例如 /index.php/admin/user/list。Nginx 本身不原生传递 PATH_INFO,若配置不当,就会导致路由识别失败、404 或 500 错误。问题核心不在 ThinkPHP,而在 Nginx 是否正确分离并注入 PATH_INFO 环境变量,以及 PHP 是否允许解析它。
确认 PHP 的 cgi.fix_pathinfo 必须为 1
这是前提条件。如果此项关闭,Nginx 传来的 PATH_INFO 会被 PHP 主动丢弃:
- 编辑对应 PHP 版本的
php.ini(如/www/server/php/74/etc/php.ini) - 查找
cgi.fix_pathinfo,确保其值为1(不是 0 或注释状态) - 保存后重启 PHP 服务:
service php-fpm-74 restart(版本号按实际调整)
修正 Nginx 的 PHP location 匹配范围
默认的 location ~ \.php$ 会拒绝匹配带斜杠的请求(如 /index.php/admin),必须放宽匹配:
- 将
location ~ \.php$ { ... }改为location ~ \.php(/|$) { ... }或location ~ [^/]\.php(/|$) { ... } - 后者更安全,可避免匹配到类似
/static/js/test.phpxxx的非法路径
用 fastcgi_split_path_info 正确提取 PATH_INFO
这是最稳定、推荐的方式,无需 if 判断,兼容性好:
- 在上述
location块内添加三行: fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;- 确保
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;已存在(通常由include fastcgi.conf;提供)
检查伪静态规则是否冲突
如果同时启用了宝塔或手动写的 rewrite 规则(如 rewrite ^(.*)$ /index.php?s=$1 last;),会绕过 PATH_INFO 模式,强制走 QUERY_STRING 模式(?s=),导致 ThinkPHP 实际没用上 PATH_INFO:
- 确认项目
config/app.php中'url_model' => 2(PATH_INFO 模式) - 删除或注释掉所有把请求重写成
?s=形式的 rewrite 规则 - 只保留基础的
try_files $uri $uri/ /index.php?$query_string;或干脆不用 try_files,依赖 PATH_INFO 分离逻辑
改完记得验证语法:nginx -t,再重载:nginx -s reload。不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











