thinkphp 6.0 路由失效90%源于nginx try_files配置错误:root必须指向public目录,标准配置为try_files $uri $uri/ /index.php?$query_string;子目录需用alias+对应兜底路径;禁用path_info及if判断,删除冲突规则如try_files $uri =404。

ThinkPHP 6.0 路由失效,90% 是因为 Nginx 的 try_files 配置没对,而不是代码或路由写错了。TP6 默认走 QUERY_STRING 模式(?s=/user/profile 这种参数方式),不依赖 PATH_INFO,所以配置必须匹配这个逻辑,否则请求压根进不了 index.php,直接 404。
确认 root 和入口路径是否正确
这是所有配置的前提:
-
root 必须指向项目的
public目录,不是项目根目录,也不是thinkphp目录;例如:root /var/www/myapp/public; - 确保
index.php真实存在于该public目录下 - 不要在
location /块里重复写root—— 它应定义在server级,否则$document_root或$realpath_root可能为空
标准 try_files 配置(根目录部署)
这是 TP6 官方推荐写法,简洁且兼容性好:
- 用
try_files $uri $uri/ /index.php?$query_string; - 第三项必须带
$query_string,否则 URL 参数(如?id=123)会丢失 - 不能写成
/index.php?s=$uri—— TP6 不再默认解析s=参数,除非你主动开启兼容模式 - 避免使用
rewrite ^(.*)$ /index.php/$1 last;,它会破坏 QUERY_STRING,且容易引发重定向循环
子目录部署要同步调整路径
比如网站地址是 https://example.com/tp6/,就不能直接套用根目录规则:
- 用
location /tp6/ {单独包裹,不要用root,改用alias /var/www/myapp/public/;(注意末尾斜杠) -
try_files的兜底目标要写成/tp6/index.php?$query_string; - 确保 PHP 处理块能命中
/tp6/index.php,建议把location ~ \.php$放在location /tp6/内部,或用正则更精确匹配(如location ~ ^/tp6/(.+\.php)(/.*)?$)
禁用干扰项:PATH_INFO 和 if 判断
TP6 默认关闭 PATH_INFO,强行启用反而容易出错:
- 注释掉或删除
fastcgi_split_path_info相关配置 - 删掉所有
if (!-e $request_filename) { rewrite ... }这类写法 —— Nginx 官方明确不推荐在location中用if做重写,行为不可靠 - 检查是否有面板自动生成的冲突规则,比如宝塔的
74.conf中的try_files $uri =404,这一行必须注释或删除,它会拦截所有非静态请求并直接返回 404
配完记得 nginx -t 测试语法,再 nginx -s reload 生效。如果还 404,先访问 /index.php 确认框架能跑,再访问 /index/index 看是否报错 —— 前者通后者挂,基本就是伪静态没生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











