路由匹配是线性扫描,不是智能推导:CodeIgniter 从 $route 数组开头逐条比对,遇首个匹配即执行,后续规则失效;必须按固定路径→中等粒度→通配符兜底顺序排列,否则导致404或参数错乱。

路由匹配是线性扫描,不是智能推导
CodeIgniter 的路由系统没有回溯或优先级评分机制,它从 $route 数组开头逐条比对,遇到第一个匹配项就立即停止并执行,后续规则完全不生效。这不是 bug,是设计使然——快、确定、可预测。
常见顺序错误导致的 404 或参数错乱
典型翻车场景:把泛化规则写在具体规则前面,比如:
$route['(:any)/(:any)/(:any)/.*'] = 'pages/view/$1/$2/$3'; $route['blog/2024/08'] = 'news/archive';
此时访问 /blog/2024/08 会命中第一条(blog、2024、08 分别赋给 、、),永远到不了第二条。正确顺序必须是:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 先写固定路径(如
admin/login、api/v1/users) - 再写带占位符的中等粒度规则(如
product/(:num)、user/(:any)) - 最后放通配符兜底(如
(:any)/(:any)/(:any)/.*)
正则通配符里的 .* 不影响前三段提取,但依赖顺序
(:any)/(:any)/(:any)/.* 这类规则能捕获 /a/b/c/d/e/f 并只传 a、b、c 给控制器,前提是它没被更靠前的 (:any)/(:any) 或 (:any) 规则提前截走。一旦顺序错,$1 可能是 a/b/c/d(如果用了 (:any) 匹配整段),参数直接崩。
404_override 不是路由,是兜底执行点
很多人以为把 $route['404_override'] = 'errors/not_found' 放在 routes.php 末尾就能“接管所有失败请求”,其实它根本不在匹配链里——它是路由引擎彻底失败后才触发的 fallback。真正决定“哪个 URL 走哪条路”的,只有 $route 数组本身的顺序。如果某条本该匹配的规则被压在了后面,请求连进控制器的机会都没有,直接 404。
application/config/routes.php,用注释标出每条规则的意图和范围,比反复刷新页面试错更省时间。顺序问题不难解,难的是第一次写时没意识到它如此严格。


















