(:any) 仅匹配单个不含斜杠的uri段,等价于正则1+;所谓“多段”错觉源于多个(:any)并列使用或误用(.*)正则,而非(:any)本身支持跨段匹配。/ ↩

(:any) 看似简单,但它在 CodeIgniter 路由中确实容易让人误解——它本身只匹配单个 URI 段(segment),而不是“多段”。真正造成“匹配多段”错觉的,是路由规则的定义方式、匹配顺序,以及开发者对 $1 $2 等参数的误用或叠加使用。
下面直接说清楚关键点:
(:any) 本质是单段匹配器
-
(:any)等价于正则([^/]+),意思是:一个不包含/的非空字符串。 - 所以
/a/b/c这样的 URL 共有 3 个 segment:a、b、c; - 单个
(:any)只能捕获其中 一个,比如$route['product/(:any)']中的(:any)只取a(当访问/product/a),不会自动吞掉b/c。
为什么有人觉得它“匹配多段”?
常见于以下两种情况:
-
多个
(:any)连续出现$route['product/(:any)/(:any)/(:any)'] = 'catalog/view/$1/$2/$3';
这里是三个独立的
(:any),分别匹配第一、第二、第三段。访问/product/123/name/detail时,$1=123,$2=name,$3=detail—— 是“多个单段”,不是“一个占位符匹配多段”。 -
错误地以为
(:any)能通配剩余全部路径
实际上,(:any)不会跨/。若你写:$route['product/(:any)'] = 'catalog/view/$1';
访问
/product/a/b/c时,CodeIgniter 仍只把a当作(:any)的值(因为后续/b/c属于额外 segment,被忽略或导致 404),除非你显式用正则(.*)或调整路由逻辑。
想真正“捕获从某段开始的所有内容”,该怎么做?
用正则 (.*) 替代 (:any):
$route['product/(.*)'] = 'catalog/view/$1'; // $1 = "a/b/c"(含斜杠)
这样 $1 就是完整子路径,可用于 explode('/', $param) 手动拆解。
路由顺序很重要
如果同时存在:
$route['product/(:any)/(:any)'] = 'catalog/two/$1/$2'; $route['product/(:any)'] = 'catalog/one/$1';
那么 /product/x/y 会命中第一条(两个 (:any)),而 /product/x 才走第二条。靠前的更具体规则优先,不是“谁更宽泛谁赢”。
总结一句话:(:any) 从不跨段匹配,它永远只吃掉一个不含 / 的字符串;所谓“多段”,是靠多个 (:any) 并列、或换用 (.*) 正则实现的。











