CodeIgniter 访问根路径时默认调用 $route['default_controller'] 指定控制器的 index() 方法,若不存在则 404;控制器名 URL 中必须小写;需检查路由配置、URL 格式、_remap() 干扰及是否真正进入控制器。

先看 routes.php 里默认控制器和方法是否匹配
CodeIgniter 访问根路径(比如 http://localhost/myapp/)时,会自动找 $route['default_controller'] 指定的控制器,并**默认调用它的 index() 方法**。如果该控制器没定义 index(),哪怕你写了 savedata() 或 list_items(),也会直接 404。
- 检查
app/Config/Routes.php(CI4)或application/config/routes.php(CI3)中$route['default_controller']的值,比如'Crud' - 确认
Crud.php控制器里是否存在public function index() - 如果只想用
savedata()作为入口,要么把savedata()改名为index(),要么在路由里显式写:$route['default_controller'] = 'Crud/savedata';
URL 中控制器名大小写和路径拼写是否符合约定
CodeIgniter 路由对控制器名大小写敏感,且 URL 中控制器名**必须小写**,哪怕类文件是 Quiz.php,访问时也得用 /quiz/get_item。常见错误包括:
- JS 中拼 URL 时漏了
index.php/(未启用重写时):错写成BASE_URL + "quiz/get_item"→ 正确应为BASE_URL + "index.php/quiz/get_item" - 启用了重写但
.htaccess未生效,或$config['index_page']没清空(CI3)/app/Config/App.php中$baseURL配置不匹配(CI4) - URL 末尾多了一个斜杠,比如
/crud//index,部分服务器会截断或拒绝
确认请求是否真的到达了控制器——加个 die('here') 快速验证
别急着查路由或模型,先排除“压根没进控制器”的可能。在目标控制器的任意方法开头加一行:
public function index()
{
die('controller reached');
// 后续逻辑...
}
如果浏览器只显示 controller reached,说明路由通、类加载正常;如果还是 404,问题一定出在前面两步(路由配置或 URL 格式);如果报 500,那可能是 PHP 解析失败(比如语法错误、命名空间缺失、use 错误)。
_remap() 是否意外拦截了所有方法调用
有些项目为了统一处理参数或权限,在控制器里加了 _remap() 方法。一旦定义,它就会接管所有方法调用——包括 index()。如果你发现 index() 明明存在却没执行,十有八九是 _remap() 里没做兜底:
- 检查控制器中是否存在
public function _remap($method, $params = []) - 如果存在,确认它是否对不存在的方法做了 fallback:比如
if (method_exists($this, $method)) { $this->$method(...); },否则直接跳过,就等同于没这个方法 - CI4 中注意
_remap()不再被自动调用,需手动注册到App\Controllers\BaseController并继承它
index()」这个隐含规则,以及 URL 中控制器名强制小写的硬性约定。这两个点卡住的人最多。


















