codeigniter路由匹配严格按代码书写顺序执行,先写先匹配、命中即止;必须遵循“具体到通用”原则,将精确规则(如article/archive/(:num))置于泛化规则(如article/(:any))之前,否则后者会拦截所有请求导致覆盖失效。

CodeIgniter 路由没有显式的“优先级”数值设置,它的匹配顺序就是代码书写顺序——先写先匹配,匹配成功即停止。所谓“避免冲突”,本质是靠人为控制规则的排列逻辑,让更具体的规则排在前面,更泛化的规则放在后面。
按具体到通用的顺序书写规则
这是最核心的原则。CI 的路由匹配是前缀式、顺序扫描,不是正则全量匹配或权重计算。一旦某条规则命中,后续规则完全不执行。
- ✅ 正确示例(推荐):
$route['article/archive/(:num)'] = 'blog/archive/$1';$route['article/(:any)'] = 'blog/show/$1';
数字归档路径会先被精确捕获,剩下的其他 article/xxx 才交给泛化规则处理。 - ❌ 错误示例(会导致覆盖):
$route['article/(:any)'] = 'blog/show/$1';$route['article/archive/(:num)'] = 'blog/archive/$1';
后者永远无法触发,因为article/anything已经把所有article/开头的请求都吃掉了。
慎用 (:any) 和正则通配符
(:any) 匹配非空任意字符,能力很强但极易“贪吃”。它适合做兜底,不适合做主力。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 能用
(:num)就不用(:any):比如用户ID、文章ID必须是数字,就明确限定,避免误匹配/user/delete这类操作路径。 - 需要更精细控制时,直接写正则:例如
$route['file/([a-z0-9_\-]+\.pdf)'] = 'files/safe_download/$1';,既限定后缀,又排除危险字符。 - 不要在泛化规则里混用多个
(:any),如admin/(:any)/edit/(:any),容易和真实路径冲突,也难维护。
合理利用路由分组(CI4专属)
CI4 的 $routes->group() 不是语法糖,而是逻辑隔离层,天然形成隐含的“作用域优先级”。
- 分组内规则自动加上统一前缀,且只在该上下文中生效,不会干扰根路径或其他分组。
- 比如后台路由全部包在
$routes->group('admin', function($routes){...})里,就不会和前台news/123规则产生命名冲突。 - 注意:必须用闭包调用,不能赋值(
$routes->group(...) = function(){}是无效的)。
验证与调试技巧
光写对还不够,得确认它真按预期运行。
- CI4 运行
php spark routes查看当前已注册的全部路由列表,检查顺序和实际解析路径是否符合预期。 - 浏览器测试务必用无痕窗口,防止 302 重定向被缓存,导致你以为改了没生效。
- 如果某个 URL 始终 404,先确认请求是否真正进了 CI(检查 Apache/Nginx 是否转发到 index.php),再查路由;否则可能根本没走到 routes.php 这一层。










