CodeIgniter写了路由仍404,大概率是路由未真正生效:规则顺序错乱(宽泛规则前置)、通配符匹配不足(如(:any)只匹配单段)、控制器/方法名大小写不一致、默认控制器缺少index()方法,或Nginx未正确传递PATH_INFO。

CodeIgniter写了路由还是404,大概率是路由没真正生效——不是写错了,而是被忽略、被覆盖,或根本没走到那条规则。
路由规则顺序错乱导致匹配失败
CodeIgniter 路由按数组顺序从上到下匹配,一旦某条规则命中,后续规则就不再检查。常见错误是把宽泛规则(如 (:any))写在了具体规则前面。
-
$route['(:any)'] = 'pages/view/$1';放在最上面 → 所有 URL 都被它吃掉,$route['admin/login'] = 'auth/login';永远不执行 - 正则规则(如
'^api/.*$')必须放在普通规则之后,否则会截断参数或提前终止匹配 - 通配符
(:any)实际等价于([^/]+),只匹配单段路径;想捕获多段要用(:any)/(:any)/.*或正则^([^/]+)/([^/]+)/(.*)$
控制器或方法名大小写/命名不一致
CodeIgniter 默认对 URL 中的控制器名强制小写,但类文件名和类定义必须首字母大写——这个“大小写分离”极易出错。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- URL 访问
/Quiz/get_item→ 实际要匹配的是quiz/get_item(控制器名必须小写) - 控制器文件名必须是
Quiz.php,类名必须是class Quiz extends CI_Controller - 方法名保持原样:
get_item()对应 URL/quiz/get_item,不能写成GetItem()或getitem() - 如果启用了严格模式(
$config['enable_query_strings'] = FALSE且$config['uri_protocol'] = 'PATH_INFO'),大小写错误会直接跳过解析,直奔 404
默认控制器 index() 方法缺失
设了 $route['default_controller'] = 'Crud';,但 Crud.php 里没有 index() 方法,访问根路径(/)就会 404。
- CodeIgniter 自动补全逻辑只认
index(),不识别savedata()、home()等其他方法 - 要么补上
public function index() { ... },要么显式改路由:$route['default_controller'] = 'crud/savedata';(注意小写) - 若用子目录(如
controllers/admin/Dashboard.php),路由必须带目录:$route['default_controller'] = 'admin/dashboard';
Nginx 下 PATH_INFO 未正确传递
Apache 下正常,Nginx 下全 404?八成是 PATH_INFO 没传进去,CI 根本没拿到真实 URI。
- 确认
application/config/config.php中$config['uri_protocol'] = 'PATH_INFO'; - Nginx 配置中必须含
fastcgi_split_path_info和fastcgi_param PATH_INFO $fastcgi_path_info; - 不要用
if (-f $request_filename)这类已被 Nginx 官方弃用的写法,它会干扰try_files行为 - 最简验证:访问
/index.php/user/profile能通,但/user/profile404 → 就是重写规则或 PATH_INFO 问题
真正卡住的地方往往不在路由语法本身,而在「谁先看到请求」——是 Nginx 直接返回 404,还是 CI 的路由系统有机会介入?先看浏览器地址栏是否含 index.php,再查 Nginx error log 是否有 “No input file specified”,最后打开 routes.php 把所有规则从下往上读一遍。顺序、大小写、PATH_INFO,三者错一个,路由就形同虚设。


















