codeigniter路由占位符匹配逻辑不同:(:num)只匹配纯数字,(:any)和(:segment)均匹配单个不含斜杠的路径段,三者均不支持多段捕获,需显式声明多个占位符。

CodeIgniter 的路由占位符用于匹配 URL 中的动态部分,不同占位符的匹配规则和适用场景有明确区别。关键不在“写法多”,而在“匹配逻辑不同”——选错会导致 404 或参数取不到。
(:num)只认纯数字
匹配连续的十进制数字(如 123、0),不接受负号、小数点、空格或任何字母。它等价于正则 \d+,但更安全(CI 内部做了严格校验)。
- ✅ 正确匹配:
/user/100、/post/9999 - ❌ 不匹配:
/user/100a、/user/-5、/user/3.14、/user/(后面没数字) - 用法示例:
$route['article/(:num)'] = 'blog/view/$1';→ 访问/article/42会调用Blog::view(42)
(:any)匹配任意非斜杠字符段
匹配 URL 中一个“路径段”(segment)内除 / 外的任意字符,包括字母、数字、下划线、短横线、中文、符号等,但不能跨斜杠。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- ✅ 正确匹配:
/page/about、/tag/php-8.3、/slug/你好-world - ❌ 不匹配:
/page/about/us(含两个斜杠,:any只吃掉第一个about,us会被丢弃或导致路由失败) - 注意:
:any不等价于.*,它不会贪婪匹配整个 URL,只截取当前段
(:segment)是 CI 4 新增的“宽松版 :any”
仅存在于 CodeIgniter 4(CI3 不支持),行为与 :any 相同:匹配单个不含斜杠的路径段。它的存在主要是语义增强和未来扩展预留,并非功能升级。
- 效果完全等同:
$route['profile/(:segment)']和$route['profile/(:any)']行为一致 - CI 4 文档推荐优先用
:segment,因名称更直观;但两者可互换,无兼容风险 - 不建议混用:同一项目中统一用一种,避免团队理解偏差
别踩坑:它们都不支持“多段捕获”
无论用哪个占位符,一次只能匹配一个路径段。想捕获多个参数,必须显式写出多个占位符:
- ❌ 错误写法:
$route['api/(:any)'] = 'api/handle';→ 只能拿到第一个段,/api/v1/users/123中只有v1被传入 - ✅ 正确写法:
$route['api/(:any)/(:any)/(:num)'] = 'api/$1/$2/$3';→ 分别捕获v1、users、123 - 或者改用正则:
$route['api/([a-z]+)/([a-z]+)/(\d+)'] = 'api/$1/$2/$3';(更精确,但需注意转义)










