ThinkPHP路由不生效主因是框架未加载路由文件:TP5依赖重写规则且默认开启,TP6默认关闭需设'app_route'=>true和'url_route_on'=>true,路由文件必须位于正确路径、含use声明及return语句,多应用需单独配置,清除缓存后用php think route:list验证。

ThinkPHP5和ThinkPHP6路由规则不生效,不是代码写错了,而是框架启动时根本没加载你的路由文件——TP5默认开启路由但依赖.htaccess或Nginx重写,TP6则默认关闭路由开关且路径约定更严格,稍有偏差就彻底跳过解析流程。
确认路由开关是否真正打开
打开 config/app.php 文件,查找 'app_route' 配置项。
TP6 必须是 【'app_route' => true】,不能是字符串 "true"、数字 1 或注释掉;TP5 对应的是 'url_route_on' => true。
TP6 还要同步检查 'url_route_on' 是否也为 true,这两个开关在 TP6 中是并存关系,缺一不可。
立即学习“PHP免费学习笔记(深入)”;
多应用项目(如 app/admin/)必须单独打开子应用目录下的 config/app.php,主应用配置不继承。
检查路由文件位置和结构
TP5 路由文件默认在 route/route.php,TP6 必须放在 app/route/app.php(单应用)或 app/{name}/route/app.php(多应用)。
TP6 的 app/route/app.php 文件顶部必须包含:
use think\facade\Route;
文件末尾必须有返回语句,例如 return Route::get('/test', 'Index/test'); 或 return Route::group(...); 否则框架认为该文件无有效路由,直接跳过加载。
TP5 的 route/route.php 可以只写 Route::rule() 语句不返回,TP6 不行——【没有 return 就等于没注册】。
清除缓存并验证是否加载成功
执行命令:
php think route:clear
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
再运行:
php think route:list
如果输出为空列表,说明路由文件根本没执行,此时要立刻检查:文件路径是否拼错、use 声明是否缺失、文件是否为空或只剩注释、是否误写进了 config/route.php。
TP5 用户注意:CLI 下 php think route:list 默认不加载路由,需加 --with-route 参数才生效。
排查 Web 服务器转发问题
访问 /index.php/user/list 能正常响应,但 /user/list 返回 404 —— 这说明请求压根没进框架,是 Nginx/Apache 没把请求重写到 index.php。
Nginx 必须配置 try_files $uri $uri/ /index.php?$query_string;,且 location / 块内生效。
Apache 用户确认 .htaccess 文件存在且 mod_rewrite 已启用,内容必须包含 RewriteEngine On 和重写规则。
Windows IIS 用户必须安装 URL Rewrite 模块,并导入 public/web.config。
区分 TP5 和 TP6 的路由注册方式
方法一:TP5 支持全局函数式定义,可在控制器里直接写 Route::rule();TP6 禁用该能力,所有路由必须写在 app/route/app.php 中。
方法二:TP5 的 Route::rule('user/:id','User/read') 默认只匹配 GET,TP6 的 Route::rule() 默认 method => '*',POST 请求也能撞入,极易引发 CSRF 漏洞——【务必改用 Route::get()、Route::post() 等语义化方法】。
方法三:TP6 的闭包路由(如 Route::get('/test', function(){}))无法被 route:list 列出,调试困难,线上环境不建议使用。


















