
CodeIgniter出现“404 Page Not Found”通常并非路由配置缺失,而是默认控制器未定义有效入口方法(如index()),或URL访问路径与实际可调用方法不匹配。本文将系统性定位并解决该常见问题。
codeigniter出现“404 page not found”通常并非路由配置缺失,而是默认控制器未定义有效入口方法(如`index()`),或url访问路径与实际可调用方法不匹配。本文将系统性定位并解决该常见问题。
在 CodeIgniter 中,$route['default_controller'] = 'Crud'; 这一行看似正确,实则隐含关键逻辑:当仅指定控制器名而未指定方法时,框架会自动尝试调用该控制器的 index() 方法。若 Crud 类中不存在 public function index(),则无论路由如何设置、.htaccess 是否启用、数据库是否连通,请求都会直接触发 404 错误——因为框架根本找不到可执行的默认入口。
回顾你的 Crud.php 文件,当前仅定义了 savedata() 方法,但没有 index() 方法。因此,当用户访问根路径(如 http://localhost/your-app/)时,CodeIgniter 尝试调用 Crud::index(),而该方法不存在,故返回 404。
✅ 正确解决方案有两种,根据业务需求选择其一:
方案一:为 Crud 控制器添加 index() 方法(推荐)
这是符合 MVC 规范且更灵活的做法。将 savedata() 的逻辑或跳转逻辑放入 index() 中,或让 index() 加载表单视图:
// application/controllers/Crud.php
public function index()
{
// 直接加载插入表单(即 insert.php 视图)
$this->load->view('insert');
}
同时,确保 routes.php 中保持默认配置:
$route['default_controller'] = 'Crud'; // ✅ 自动调用 Crud::index() $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE;
⚠️ 注意:控制器类名首字母必须大写(Crud),但对应文件名 Crud.php 和 URL 中的控制器名(如 /crud/)在 CodeIgniter 3 中不区分大小写;不过为避免潜在问题,建议统一使用 PascalCase 命名,并确认文件名与类名完全一致(含大小写)。
方案二:显式指定默认方法(不推荐用于生产环境)
若你坚持以 savedata 作为首页入口,可修改路由:
$route['default_controller'] = 'Crud/savedata';
此时访问根路径将直接执行 Crud::savedata()。但需注意:savedata() 当前逻辑存在缺陷——它先加载视图,再检查 POST 数据。这会导致表单首次加载时即执行一次空提交判断,且无法复用视图返回结果。
建议重构 savedata() 为标准的“处理+跳转”模式:
public function savedata()
{
// 若为 POST 请求,则处理数据
if ($this->input->post('save')) {
$data = [
'first_name' => $this->input->post('first_name'),
'middle_name' => $this->input->post('middle_name'),
'last_name' => $this->input->post('last_name'),
'username' => $this->input->post('username'),
'password' => $this->input->post('password'),
'confirmpassword' => $this->input->post('confirmpassword'),
'birthday' => $this->input->post('birthday'),
'email' => $this->input->post('email'),
'contactnumber' => $this->input->post('contactnumber')
];
$result = $this->Crud_model->saverecords($data);
$this->session->set_flashdata('message', $result ? 'Records Saved Successfully' : 'Insert error!');
redirect('crud'); // 重定向回 index() 或其他页面
} else {
// 首次访问时仅显示表单
$this->load->view('insert');
}
}
此外,请务必验证以下基础配置(常被忽略):
- ✅ .htaccess 文件位于项目根目录,内容正确(启用 Apache mod_rewrite):
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] - ✅ config.php 中 index_page 设为 'index.php'(默认值),且 Web 服务器允许 URL 重写;
- ✅ base_url() 在视图中正常输出(可在 insert.php 开头加 测试);
- ✅ 数据库配置无误,Crud_model 中的表名 TSA2exam 存在且字段匹配。
总结:CodeIgniter 的 404 核心原因往往是控制器缺少 index() 方法,而非路由或服务器配置。优先为控制器补充规范的 index() 入口,并采用 POST-redirect-GET 模式优化表单处理逻辑,即可彻底解决该问题。











