Codeigniter中如何将不存在资源的页面统一重定向到自定义404页面
多段路径404跳转失效原因
你当前配置的$route['(:any)'] = "common/pageNotFound";仅能匹配未命中其他路由规则的请求,多段路径失效的核心原因是:
- 路由匹配遵循从上到下的优先级,你项目中已配置的
product/xxx类路由会优先命中,不会走到最底部的(:any)兜底规则 - 请求命中对应控制器后,框架会尝试调用与路径参数匹配的方法,方法不存在时会默认抛出系统错误,不会触发兜底路由
统一404跳转方案(无需逐个Controller写判断)
方案1:使用框架原生404覆盖配置(最快捷)
CodeIgniter原生支持全局自定义404处理逻辑,直接修改application/config/routes.php配置即可:
// 注释掉原来的$route['(:any)']兜底路由,替换为以下配置 $route['404_override'] = 'common/pageNotFound';
该配置会自动接管所有框架层面的404请求,包含:
- 未匹配到任何路由规则的全路径请求(支持多段路径)
- 控制器存在但对应调用方法不存在的请求
如果控制器内查询数据为空需要触发404,直接调用框架自带的show_404()方法即可,会自动跳转至你自定义的common/pageNotFound页面。
方案2:基础控制器封装统一校验逻辑
如果需要批量处理控制器内空数据的404跳转,可以创建基础控制器统一封装:
- 在
application/core目录下新建MY_Controller.php文件:
class MY_Controller extends CI_Controller { public function __construct() { parent::__construct(); } // 统一空数据校验跳转方法 protected function return_data_or_404($data) { if (empty($data)) { show_404(); } return $data; } }
- 所有业务控制器继承
MY_Controller,查询数据后直接调用封装方法即可:
// 示例product控制器内的调用逻辑 $product_info = $this->product_model->get_by_id($id); $product_info = $this->return_data_or_404($product_info);
PHP默认错误页替换为自定义404
框架层面修改
直接修改application/errors/html/目录下的对应错误模板:
- 自定义404页面修改
error_404.php - 自定义全局PHP错误页修改
error_general.php
可以直接把你设计好的404页面代码替换到对应模板文件中即可。
服务器层面修改
如果需要全局接管服务器级别的404请求,可以在站点配置中添加规则:
- Apache环境(根目录
.htaccess添加):
ErrorDocument 404 /index.php/common/pageNotFound
- Nginx环境(站点配置文件添加):
error_page 404 /index.php/common/pageNotFound;
注意:在
common/pageNotFound方法中需要添加$this->output->set_status_header(404);代码,确保返回正确的404 HTTP状态码,避免影响SEO。
内容的提问来源于stack exchange,提问作者havingaheadache
相关产品推荐
相关产品推荐

