codeigniter路由匹配顺序必须从具体到泛用,通配符规则(如(:any))须置于最后,否则会拦截后续精确匹配;默认控制器不参与匹配,自定义路由会关闭自动解析机制,需确保大小写、文件名、类名严格符合约定。

检查 $route 数组顺序是否倒置
CodeIgniter 路由匹配是「从上到下」逐条比对,一旦命中就停止,后续规则失效。很多人把泛用规则(如 $route['(:any)'] = 'pages/view/$1';)写在前面,结果所有请求都被它吃掉,真正该匹配的 $route['blog'] = 'post/index'; 永远没机会执行。
- 打开
application/config/routes.php,确认最具体的路由写在最上面,通配符类规则((:any)、(:num))必须放在最后 - 临时注释掉所有通配符规则,只留一条
$route['test'] = 'welcome/index';,访问/test看是否正常——能通说明路由文件本身可加载,问题出在规则逻辑 - 注意:如果用了
$route['default_controller'],它本质是「无 URI 时的 fallback」,不参与 URI 匹配,不会和其它规则冲突
验证自定义路由是否误覆盖了默认解析
CodeIgniter 默认支持 /控制器/方法 格式,但一旦你在 routes.php 中写了任何 $route['xxx'] = 'yyy',就会关闭这个自动解析机制——哪怕那条规则根本没被触发。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 例如:
$route['user/profile'] = 'users/show';这条本身没问题,但它会让/users/list(假设存在Users控制器和list()方法)直接 404,因为框架不再尝试自动映射 - 解决办法:要么补全所有需要的路由,要么删掉这条自定义规则,改用更安全的写法:
$route['user/(:any)'] = 'users/$1';,保留自动分发能力 - 特别注意大小写:
$route['Blog'] = 'blog'是无效的——路由左侧(URI 段)必须全小写,右侧控制器名也必须小写(CodeIgniter 2.x 不接受首字母大写)
排查 $route['404_override'] 是否干扰调试
启用 $route['404_override'] 后,所有未匹配请求都会进指定控制器,表面看是「有响应」,实际掩盖了真实路由失败原因——你看到的可能是自定义 404 页面,而不是原始的「No input file specified」或空白页。
- 临时注释掉
$route['404_override']行,再试一次出问题的 URL;如果变成白屏或 PHP 报错,说明请求确实没进框架,问题在服务器层或入口路径 - 如果仍 404,但错误信息变成「Unable to load your default controller」,说明路由没匹配到任何控制器,重点查
$route['default_controller']对应的文件是否存在、类名是否为Welcome、是否含index()方法 - 别忽略隐藏的空格:复制粘贴代码时,
$route['home '] = 'welcome/index';(末尾空格)会导致匹配永远失败
确认控制器文件与类名是否严格符合约定
CodeIgniter 2.x 对文件系统大小写极其敏感,尤其部署到 Linux 服务器后,user.php 和 User.php 是两个不同文件,但框架只认后者。
- URL 中的控制器段必须全小写:
/User/profile→ 会去找User.php文件,但实际应访问/user/profile - 控制器文件名必须首字母大写:
application/controllers/User.php,内部类名也必须是class User extends CI_Controller - 方法名必须是 public 且不以双下划线开头:
private function helper()或__destruct()都无法被路由调用 - 快速验证法:直接访问
/index.php/user/profile(带index.php),如果能通,说明是重写规则问题;如果仍 404,90% 是控制器文件或类名不匹配
$route['api'] = 'rest';,却让所有以 /api/ 开头的子路径全部失效。动手改之前,先关掉 404_override,用 /index.php/ 直连测试,比反复猜要快得多。










