CodeIgniter原生路由默认只匹配URI路径、不校验HTTP方法,故$route['users'] = 'users/index'天然响应GET请求;需按方法隔离时须用REST扩展并遵循_method_get命名规范。

CodeIgniter 的 GET 请求路由不需要额外配 HTTP 方法限定——默认所有路由都响应 GET,除非你显式用了 REST 扩展或手动限制方法。
为什么 $route['users'] = 'users/index'; 就能响应 GET
CodeIgniter 原生路由不区分 HTTP 方法。只要 URL 匹配规则,就直接分发到对应控制器方法,不管你是用浏览器地址栏输、a 标签跳转,还是 curl http://x/users,它都走 GET 流程。这是框架默认行为,不是 bug,是设计如此。
常见错误现象:
– 写了 $route['api/users']['GET'] = 'api/users/index'; 却发现 POST 也能访问(因为原生路由根本不校验 method);
– 用浏览器打开 /users 返回 404,但控制器明明存在——其实是 $route['default_controller'] 没设对,或控制器文件名/类名大小写不一致。
- 原生路由只看 URI 字符串是否匹配,不看请求头里的
Method - 若需真正按 HTTP 方法隔离(比如 GET 查、POST 增),必须用
chriskacergmann/codeigniter-restserver这类扩展,或自己在控制器里用$this->input->method()判断 -
$route['users'] = 'users';等价于$route['users'] = 'users/index';,因为 CodeIgniter 默认调index()
REST 扩展下怎么配 GET 路由才生效
如果你装了 REST Server,那必须配合控制器方法命名规范和路由表双约束。单独改 routes.php 不够,控制器方法名必须带 _get 后缀,否则 404。
正确写法示例:
$route['api/users']['GET'] = 'api/users/index'; $route['api/users/(:num)']['GET'] = 'api/users/show/$1';
对应控制器里必须有:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
class Users extends REST_Controller
{
public function index_get() { ... }
public function show_get($id) { ... }
}
- 方法名末尾的
_get是硬性约定,index_get()≠index() - 如果漏写
_get,即使路由匹配成功,REST Server 也会跳过该方法,最终 fallback 到 404 - 参数捕获(如
(:num))仍靠路由占位符,但值会自动传给show_get($id)的第一个参数,不是靠$1手动拼接
GET 参数怎么传?别在路由里硬编码
URL 查询参数(如 ?page=2&limit=10)根本不用写进路由规则。CodeIgniter 会自动解析并挂到 $this->input->get() 上。
错误做法:
$route['users/page/(:num)/limit/(:num)'] = 'users/index/$1/$2'; // ❌ 多余且脆弱
正确做法:
$route['users'] = 'users/index'; // ✅ 简洁,参数走 query string
然后在控制器里:
public function index()
{
$page = $this->input->get('page', true); // 第二个参数 true 表示 XSS 过滤
$limit = $this->input->get('limit', true);
}
- 查询参数永远走
$this->input->get(),不要试图用(:any)去匹配?xxx部分——它根本不在 URI path 里 - 如果真要支持
/users/2/10这种路径式分页,才用占位符:$route['users/(:num)/(:num)'] = 'users/index/$1/$2';,但这属于路径参数,不是 GET 参数 - 混合使用(如
/users/2?sort=name)时,路径段由路由捕获,query string 仍走get()
最易被忽略的一点:路由顺序决定匹配结果。$route['users/(:any)'] 这种宽泛规则如果写在 $route['users/profile'] 前面,后者就永远不会命中——CodeIgniter 是从上到下逐条匹配的,没有回溯。调试时先检查规则位置,再查控制器是否存在。


















