ThinkPHP路由按定义顺序从上到下匹配,静态路径如user/profile必须置顶,通配符规则user/:id须在其后,多级变量user/:id/edit需排在user/:id之前,兜底规则user/*必须放最后,域名路由需正确使用闭包参数$r调用方法。

ThinkPHP路由优先级设置不对会导致访问/user/profile时被当成user/:id匹配,:id值变成字符串"profile",控制器逻辑直接崩掉,用户看到404或错误数据。
静态路径被通配规则吃掉
Route::get('user/:id', 'User/read')写在Route::get('user/profile', 'User/profile')前面,访问/user/profile时不会进入profile方法,而是被:id捕获,$id = 'profile',后续代码按数字ID处理字符串"profile",抛出类型错误或数据库查不到记录。
这一步不能靠正则补救——哪怕给:id加了[\d+]约束,匹配失败后也不会自动跳到下一条规则,而是直接报404。
【必须把user/profile这类完全静态路径放在所有含变量的规则之前】
立即学习“PHP免费学习笔记(深入)”;
多级变量路径被截断
Route::get('user/:id', 'User/read')排在Route::get('user/:id/edit', 'User/edit')前面,访问/user/123/edit时,框架只匹配到:user/:id,把$id解析为"123/edit",edit段根本进不到控制器。
此时User/read方法收到一个非法ID,可能触发SQL注入防护、类型转换失败或空结果返回。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
正确顺序是:先user/:id/edit → 再user/:id → 最后user/*。
兜底规则提前生效
Route::get('user/*', 'User/other')放在Route::get('user/settings', 'User/settings')前面,所有以user/开头的请求都会被*吃掉,settings页面永远无法访问。
这种兜底规则必须压在最底部,否则它会拦截一切子路径,包括你还没定义的API接口。
域名路由完全不触发
方法一:全局写了Route::rule('api/v1/user', 'Api/User/index'),又单独定义Route::domain('api.example.com', function() { Route::rule('v1/user', 'Api/User/index'); }),但没删掉全局那条。
结果是请求api.example.com/v1/user时,先命中全局rule,根本不会进domain闭包,domain里写的路由形同虚设。
方法二:在domain闭包里错写成Route::rule(),而没用闭包参数$r→get(),导致该子域下所有路由注册失败,全部回退到主域逻辑。
【Route::domain()内部必须用闭包传入的$r对象调用$r->get()等方法】


















