CodeIgniter 4路由配置需彻底重构:默认禁用自动路由,须显式启用或逐条声明;URL与控制器映射严格区分大小写、依赖命名空间;CI3数组式路由失效,须改用get/post等方法及(:segment)等新占位符;默认控制器需通过setDefaultNamespace和get('/')显式设置;分组与子域名路由需用group()和setHTTPHost()重构。

将CodeIgniter 3项目升级到CI4时,路由配置看似只是改几行代码,实则涉及底层机制变更——CI4默认关闭自动路由、URL路径与控制器类名不再隐式映射、大小写敏感且不支持CI3风格的$routes->route[]数组写法,直接复制粘贴旧配置必然导致全部404。
自动路由必须显式启用或彻底废弃
CI4默认禁用自动路由,即使你保留了CI3中习惯的application/config/routes.php里类似$route['default_controller'] = 'welcome';的写法,框架也完全无视。
打开app/Config/Routes.php,确认首行是否为$routes->setAutoRoute(false);——这是CI4安装后的默认值,必须手动改为true才能启用自动路由。
⚠️ 注意:【启用自动路由仅适用于快速验证或极小原型,生产环境强烈建议禁用】,否则/Home/index和/home/Index可能同时可访问,造成重复内容与安全风险。
若选择禁用自动路由(推荐),则所有控制器入口都必须在Routes.php中逐条声明,例如:$routes->get('/about', 'About::index');。
URL路径与控制器类名映射规则彻底改变
方法一:按CI4规范重写路由映射
CI3中$route['products/(:any)'] = 'catalog/product_lookup/$1';这种写法在CI4中完全失效。必须改用闭包或命名参数语法:
$routes->get('/products/(:segment)', 'Catalog::product_lookup/$1');
其中(:segment)替代CI3的(:any),且只匹配单段路径(不含斜杠);如需多段,改用(:any)但需配合setTranslateURIDashes(false)防止下划线被转义。
方法二:保留部分CI3风格路径但强制统一大小写
CI3对控制器名大小写不敏感(home、HOME、Home都指向同一类),CI4严格要求类名首字母大写、方法名全小写。若你有controllers/user_login.php含类User_login,必须重命名为app/Controllers/UserLogin.php,类声明改为class UserLogin extends Controller,再路由定义为$routes->get('/user-login', 'UserLogin::index');。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
这一步不做,访问时直接报错Class 'User_login' not found,而不是404。
默认控制器与根路径配置方式不同
第一步:删除CI3遗留的$route['default_controller']语句
CI4中该变量已无效,继续保留会误导维护者,且无任何运行时影响——纯噪音代码。
第二步:用$routes->setDefaultNamespace('App\Controllers');确保命名空间正确
CI4路由系统依赖命名空间定位控制器,默认是App\Controllers,若项目自定义过命名空间(如MyApp\Controllers),此处必须同步更新,否则Home::index找不到类。
第三步:显式绑定根路径
$routes->get('/', 'Home::index');——这行必须存在,且不能写成$routes->get('', 'Home::index');,空字符串路径不会触发根路由匹配。
路由分组与子域名支持需重构
CI3中常用$route['admin/(:any)'] = 'admin/$1';实现后台路由前缀,CI4应改用分组语法:
$routes->group('admin', ['namespace' => 'App\Controllers\Admin'], function ($routes) {<br> $routes->get('/', 'Dashboard::index');<br> $routes->get('users', 'Users::list');<br>});
子域名路由在CI4中不再通过$route数组配置,而需在app/Config/App.php中设置public $baseURL = 'https://admin.example.com/';,再结合$routes->setHTTPHost('admin.example.com');做条件匹配。
若忽略此点,部署到多子域环境时,所有路由都会 fallback 到主域名逻辑,后台页面无法加载。


















