You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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跳转,可以创建基础控制器统一封装:

  1. 在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;
    }
}
  1. 所有业务控制器继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:15:03