强制路由生效需同时启用url_route_on和url_route_must、清除runtime/route目录、将规则写入正确路径文件(TP5.x为route/route.php,TP6.x为app/route/app.php),并拦截m/c/a参数请求。

强制路由不是配个开关就完事,url_route_must 设为 true 只是第一步,漏掉缓存清理或路由文件位置错误,它根本不会生效。
确认 url_route_must 和 url_route_on 都已启用
这两个配置必须同时为 true,缺一不可。它们都在 config/route.php 中(TP5.x)或 config/app.php 的 route 配置块里(TP6.x)。注意:url_route_on 控制路由系统是否启动,url_route_must 才控制“是否只认显式定义的路由”。
-
'url_route_on' => true:不开启,整个路由模块直接跳过 -
'url_route_must' => true:开启后,所有未在路由文件中明确定义的 URL 都会 404 - TP6 中还要检查
app_route是否为布尔true(在config/app.php),否则路由文件压根不加载
删掉 runtime/route/ 整个目录,别只清空内容
ThinkPHP 编译路由后会把规则写死进 runtime/route/ 下的 PHP 文件。改了配置但没删这个目录,框架照旧用旧缓存——你看到的“没生效”,90% 是这个原因。
- 必须删除
runtime/route/这个**文件夹本身**,不是删里面的内容 - TP6 推荐用命令行清:执行
php think route:clear,更可靠 - 顺手也检查下有没有残留的
.route.php.swp类临时文件(vim 编辑未退出时生成),它们会干扰路由加载
路由规则必须写在正确的文件里
TP6 路由定义和配置开关是分离的:config/route.php 只管开关,具体规则得写在 app/route/app.php(单应用)或 app/{name}/route/app.php(多应用)。写错地方,开关再对也没用。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
- 文件开头必须有
use think\facade\Route;,否则Route::get()直接报类不存在 - TP5.x 是
route/route.php;TP6.x 是app/route/app.php,路径别混 - 子域名路由(如
admin.example.com)必须用Route::domain()单独注册,主域名规则不会继承过去
拦截 m/c/a 参数的请求要靠额外校验
即使开了 url_route_must,带 ?m=index&c=user&a=login 的请求仍可能绕过路由匹配,被框架底层解析。这不是 bug,是设计如此——强制路由只管 URL 路径,不管 query string。
- 在
app/common.php或app_init事件中加判断:if (input('m') || input('c') || input('a')) { throw new \think\exception\HttpException(404); } - 这段代码必须在路由匹配前执行,否则无效
- 若用了闭包路由或动态变量(如
Route::rule('api/:version', function() {})),参数解析逻辑更复杂,硬拦截更必要
真正卡住强制路由生效的,往往不是配置本身,而是缓存残留、文件路径错位、或 query 参数绕过——这三处不盯紧,开关开着也等于没开。


















