CodeIgniter中如何创建匹配以cms开头的所有路由?
解决CodeIgniter中匹配所有以"cms"开头路由的问题
嘿,我来帮你搞定这个路由匹配的问题!你之前用$route['(^cms)'] = 'welcome';只能匹配字面的"cms",是因为这个正则只检查了URI开头是cms,但没允许后续的任何内容——相当于只有当URI完全等于"cms"时才会触发匹配,带斜杠和子路径的情况直接被排除了。
正确的正则写法
要匹配所有以"cms"开头的路由(包括带多级斜杠的子路径),你可以用这个规则:
$route['^cms(/.*)?'] = 'welcome';
我拆解一下这个正则的逻辑:
^cms:强制要求URI的开头是"cms",避免误匹配类似"xcms"这类路径(/.*)?:这部分是可选的(?表示可出现0次或1次):/:匹配斜杠分隔符.*:匹配任意长度的任意字符(包括更多斜杠和嵌套子路径)- 整个
(/.*)?既允许"cms"本身,也支持"cms/xxx"、"cms/xxx/yyy/zzz"这类多级目录路径
额外注意事项
- 路由顺序优先:记得把这个规则放在其他更具体的路由规则前面,因为CodeIgniter是按从上到下的顺序匹配路由的,先匹配到的规则会优先生效。
- 传递子路径参数(可选):如果你需要把"cms"后面的子路径传递给
welcome控制器的方法,可以去掉?并使用反向引用:
这样访问$route['^cms(/.*)'] = 'welcome$1';cms/about就会调用welcome控制器的about方法,访问cms/blog/post/123就会触发welcome控制器的blog/post/123方法(需要控制器支持这种URI分段的方法调用逻辑)。
测试用例
这个规则会匹配以下所有URI:
cmscms/dashboardcms/users/listcms/content/edit/456
而不会匹配abc、xcms/test这类不以"cms"开头的路径。
内容的提问来源于stack exchange,提问作者i.brod
相关产品推荐
相关产品推荐

