ci3.1.13默认控制器不支持子目录路径,因_set_default_controller()仅用sscanf()解析“类名/方法名”,将admin/home误判为控制器admin、方法home,却在根目录找admin.php而非admin/home.php,导致file_exists()失败并静默404。

默认控制器必须是顶层控制器文件,不能带子目录路径;否则 CI3.1.13 会直接报 404。
为什么 $route['default_controller'] = 'admin/home' 会 404
CI3.1.13 的 _set_default_controller() 方法内部用 sscanf() 拆分配置值,但只支持 类名/方法名 格式,不支持 目录/控制器名。它会把 'admin/home' 当作控制器类名 Admin、方法名 home,然后去 APPPATH.'controllers/Admin.php' 查找——而实际文件在 controllers/admin/Home.php,自然找不到。
- CI3 不再兼容 CI2 风格的子目录默认控制器写法
- 哪怕文件真实存在且路径正确,
file_exists()检查也会失败 - 错误不会抛出明确提示,只会静默触发 404
正确设置顶层控制器为默认首页
确保控制器文件位于 application/controllers/ 根目录下(如 Home.php),且类名与文件名严格一致:
class Home extends CI_Controller
{
public function index()
{
$this->load->view('home_view');
}
}
然后在 application/config/routes.php 中写:
-
$route['default_controller'] = 'home';(小写,不带扩展名) - 对应文件必须是
application/controllers/Home.php - 类中必须有
index()方法,CI 默认调用它
想用子目录结构(如 admin/)怎么办
CI3.1.13 不允许子目录控制器当默认入口,但可以通过路由重定向绕过限制:
- 保留一个顶层空壳控制器,比如
Root.php:
class Root extends CI_Controller
{
public function index()
{
redirect('admin/dashboard'); // 或 'home/index'
}
}
- 再配
$route['default_controller'] = 'root'; - 所有子目录控制器(如
application/controllers/admin/Dashboard.php)照常定义,仅通过redirect()或load->controller()(需手动加载)跳转
这是 CI3.1.13 下最稳定、无兼容风险的做法。别试图在 default_controller 里写路径,框架底层根本不认。











