直接改 $route['default_controller'] 仅适用于 CI2;CI3 不支持子目录写法,需用显式路由;CI4 已废弃该配置,须用 $routes->setDefaultController() 并严格匹配命名空间、文件名与类名。

直接改 $route['default_controller'] 就行,但具体怎么写、为什么有时改了还是 404,得看你是 CI2、CI3 还是 CI4——三者规则完全不同,混用就会失败。
CI2 和 CI3 中设置子目录控制器为默认控制器的区别
CI2 支持在 $route['default_controller'] 里写路径,比如 'admin/dashboard',框架会自动加载 application/controllers/admin/Dashboard.php;CI3 则**完全不支持**这种写法,哪怕你文件结构和命名都对,也会报 404。
- CI2 可用:
$route['default_controller'] = 'admin/home'; - CI3 不可用:必须把控制器文件放在
application/controllers/根目录下,且类名首字母大写,如Home.php→class Home extends CI_Controller - CI3 想用子目录?只能靠显式路由兜底,比如:
$routes->get('/', 'Home::index');(CI3 的routes.php里不支持$route数组写法)
CI4 中改默认控制器的硬性要求
CI4 不允许“修改命名规则”,只允许“按规则写”。$route['default_controller'] 在 CI4 中已废弃,必须用 $routes->setDefaultController() 或显式路由定义入口。
- 控制器文件必须放在
app/Controllers/下,类名与文件名严格一致且首字母大写,例如app/Controllers/Dashboard.php→class Dashboard extends BaseController - 路由注册必须带完整命名空间:
$routes->get('/', 'Dashboard::index');,不能写'dashboard::index'或'Dashboard/index' - 如果控制器在子命名空间下(如
app/Controllers/Admin/Users.php),路由必须写成:$routes->get('/admin/users', 'AdminUsers::index');
为什么改了还是 404?三个地方最容易漏
不是配置没生效,而是加载器根本没找对位置。CI 加载控制器依赖三处同步:
-
app/Config/Constants.php中的APP_NAMESPACE(默认是'App') - 控制器文件顶部的
namespace声明(必须是AppControllers或其子空间,如AppControllersAdmin) -
app/Config/Autoload.php中的$psr4映射(默认已有'App\' => APPPATH,别删或改错)
任意一个不匹配,就会报 Class not found,而不是“找不到方法”——这是最常被误判为“配置无效”的真实原因。
CI4 的路由和加载机制是强约束型的,不是“设个变量就能绕过”。想少踩坑,就老老实实让文件名、类名、命名空间、路由字符串四者完全一致,少动“我以为可以改”的地方。


















