codeigniter路由必须手动写入application/config/routes.php的$route数组,格式为$route['uri_pattern'] = 'controller/method';支持(:num)、(:any)等占位符传参,default_controller默认调用index方法,rest需按http方法分键声明。

路由规则写法必须是 $route['uri_pattern'] = 'controller/method';
CodeIgniter 的路由不是靠注解或配置文件夹自动扫描,所有映射都得手动写进 application/config/routes.php 里的 $route 数组。最基础的写法就是左边写 URL 路径模式,右边写「控制器名/方法名」字符串。
常见错误现象:写了 $route['login'] = 'Auth/login'; 却访问不到——可能因为 Auth.php 控制器没放在 application/controllers/ 下,或者类名不是 Auth(必须首字母大写、文件名大小写严格匹配),或者 login() 方法没定义成 public。
-
$route['login'] = 'Auth/login';→ 访问/login会调用Auth::login() -
$route['admin'] = 'Admin/dashboard';→/admin映射到Admin::dashboard(),不走默认的index() - 如果右边只写控制器名(如
'Auth'),CI 会自动补上/index,即等价于'Auth/index'
带参数的路由要用占位符,别手写正则除非真需要
URL 中有动态段(比如 /user/123)时,不能硬编码数字,得用 CI 内置占位符。它们比正则更安全、更易读,也避免因转义出错导致整个路由失效。
容易踩的坑:用 (:any) 匹配数字 ID,结果被注入恶意路径(如 /user/../../etc/passwd);或者把 (:num) 写成 (:number) ——后者根本不会被识别。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
$route['user/(:num)'] = 'User/profile/$1';→$1是捕获的数字,传给profile()方法作为第一个参数 -
$route['post/(:any)'] = 'Blog/view/$1';→(:any)匹配除斜杠外的任意字符,适合 slug - 想限制为字母+数字?用
(:alphanum),比(:any)更安全
$route['default_controller'] 不等于「首页路由」,它实际指向 controller/index
很多人以为设了 $route['default_controller'] = 'Home'; 就能用 / 访问 Home 任意方法,其实不是。CI 会固定拼上 /index,最终调用的是 Home::index() —— 如果这个方法不存在,立刻 404。
典型错误:控制器叫 Crud.php,里面只有 savedata(),但设了 $route['default_controller'] = 'Crud';。访问根路径时,CI 找 Crud::index(),找不到就报 404,哪怕 savedata() 是你真正想暴露的入口。
- 要么补上
public function index() { $this->savedata(); } - 要么改路由:
$route['default_controller'] = 'Crud/savedata';(CI 3.1.11+ 支持这种写法) - 注意:CI 3.x 默认不支持
default_controller指向非index方法,升级或手动补逻辑更稳妥
RESTful 路由要显式声明 HTTP 方法,GET 和 POST 不能混用
CI 3.x 原生不区分请求方法,但你可以用数组键语法实现类似 REST 的语义路由。关键是:同一个 URI 模式下,GET 和 POST 必须分开定义,否则后写的会覆盖前写的。
性能影响小,但逻辑混乱风险高。比如 $route['api/user']['GET'] 和 $route['api/user']['POST'] 看似并列,其实底层是两个独立数组项;若漏写方法类型,CI 会当成普通字符串路由,失去语义控制。
$route['api/users']['GET'] = 'api/Users/index';$route['api/users']['POST'] = 'api/Users/store';$route['api/users/(:num)']['PUT'] = 'api/Users/update/$1';- 注意控制器路径大小写:CI 对控制器文件名敏感,
Users.php类名必须是Users,不能是users或API_Users










