CodeIgniter 4 路由组通过 $routes->group() 原生支持统一前缀与配置(如 namespace、filter),语义清晰、易维护;CI3 无此功能,需手动正则映射且易出错;base_url() 不影响路由,API 地址应单独配置并联动 CORS 过滤器作用域。

CodeIgniter 4 的路由组(Route Group)是最直接的方式
CodeIgniter 4 原生支持路由分组,用 $routes->group() 包裹一组控制器方法,自动为所有子路由添加统一前缀。这是官方推荐、语义清晰、且不影响中间件和过滤器执行顺序的做法。
常见错误是把前缀硬写进每个 $routes->get() 的 URI 字符串里,导致重复、难维护,还容易漏掉 POST/PUT 等方法。
- 在
app/Config/Routes.php中使用: $routes->group('api', ['namespace' => 'App\Controllers\Api'], function ($routes) { $routes->get('users', 'Users::index'); $routes->post('users', 'Users::create'); });- 访问地址自动变成
/api/users,无需改控制器或视图中的 URL 构造逻辑 - 注意:
group()第二个参数是可选的数组,可用于统一设置namespace、filter、hostname等,避免重复声明
CodeIgniter 3 不支持原生路由组,得靠自定义路由规则
CI3 没有 group() 方法,必须手动在 application/config/routes.php 中用正则或通配符批量映射。稍不注意就会覆盖默认路由或造成循环重定向。
典型错误是写成 $route['api/(:any)'] = 'api/'; 却忘了控制器实际路径可能含子目录(如 Api/Users),导致 404。
- 正确写法(适配子命名空间):
$route['api/(:any)'] = 'api/$1';+ 确保控制器类文件放在application/controllers/api/下,类名首字母大写(如Users.php→class Users extends CI_Controller) - 若控制器在更深路径(如
application/controllers/api/v1/Users.php),需显式写:$route['api/v1/(:any)'] = 'api/v1/$1'; - 不要用
$route['api/(.*)']——(.*)会匹配空字符串,可能意外触发根路由
别碰 $config['base_url'] 或 base_url() 来“伪造”前缀
有人试图通过修改 $config['base_url'](比如设成 https://example.com/api/)让所有 base_url() 输出带前缀的链接,但这只影响静态资源路径,对控制器路由完全无效——请求仍发往 /index.php/welcome/login 这类原始路径,和接口前缀无关。
更危险的是,它会让 CSS/JS 路径错乱,而且一旦部署到子目录(如 /myapp/),base_url() 本就该包含该子目录,再叠加上 API 前缀就彻底混乱。
-
base_url()只管资源(图片、CSS、JS),不管路由 - 控制器跳转(
redirect())、表单提交(form_open())、AJAX 地址都依赖路由系统,不是base_url() - 真要动态构造 API 地址,应单独定义配置项,例如
$config['api_base'] = '/api',然后在视图中拼接:site_url($config['api_base'].'/users')
前缀和 CORS 过滤器必须联动处理
加了前缀后,如果同时启用 CORS(比如用 CorsFilter),过滤器的匹配路径必须包含该前缀,否则 OPTIONS 预检请求会 404 或被跳过,前端卡死在预检阶段。
常见疏漏是过滤器只注册在 app/Config/Filters.php 的 globals 里,但没指定 before 和 after 的 URI 匹配范围,导致它没生效于 /api/* 路由。
- 在
Filters.php中明确限定作用域:'cors' => ['before' => ['api/*']] - 确保
CorsFilter类里的before()方法校验的是当前请求的完整 URI($request->getUri()->getPath()),而不是硬编码路径 - 禁止在控制器里用
header()补 CORS 头——OPTIONS 请求根本不会进控制器,必须靠过滤器前置拦截


















