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

如何在URL不匹配任何控制器或方法时触发404页面

实现404错误页面的方案

步骤1:创建NotFound控制器

在app/controllers/目录下新建NotFound.php文件,写入以下内容:

<?php
class NotFound {
    public function index() {
        // 设置标准HTTP 404状态码
        http_response_code(404);
        // 这里可以替换为你的自定义404页面HTML内容
        echo "<h1>404 - 页面未找到</h1>";
        echo "<p>你访问的页面不存在,请检查URL是否正确。</p>";
    }
}

步骤2:修改App.php的路由逻辑

调整App类的构造函数,当控制器不存在或方法不存在时,自动切换到NotFound控制器:

修改后的完整App.php代码:

<?php
class App {

    protected $controller = 'Home';
    protected $method = 'index';
    protected $params = [];

    public function __construct() {
        $url = $this->parseUrl();

        // 检查控制器文件是否存在
        if(isset($url[0]) && file_exists('app/controllers/' . ucfirst($url[0]) . '.php')) {
            $this->controller = ucfirst($url[0]);
            unset($url[0]);
        } elseif(isset($url[0])) {
            // 控制器不存在时,切换到NotFound
            $this->controller = 'NotFound';
            $url = [];
        }

        require_once 'app/controllers/' . $this->controller . '.php';
        $this->controller = new $this->controller;
        
        // 检查方法是否存在
        if(isset($url[1])) {
            if(method_exists($this->controller, $url[1])) {
                $this->method = $url[1];
                unset($url[1]);
            } else {
                // 方法不存在时,切换到NotFound控制器
                $this->controller = new NotFound();
                $this->method = 'index';
                $url = [];
            }
        }

        $this->params = $url ? array_values($url) : [];
        call_user_func_array([$this->controller, $this->method], $this->params);
    }

    public function parseUrl() {
        if(isset($_GET['url'])) {
            return explode('/', filter_var(
                rtrim($_GET['url'], '/'),
                FILTER_SANITIZE_STRING
            ));
        }
        return []; // 返回空数组避免后续null报错
    }
}

核心修改说明

  • 控制器判断分支:新增elseif(isset($url[0])),当用户输入的控制器名称对应文件不存在时,直接切换到NotFound控制器。
  • 方法判断分支:新增else逻辑,当控制器存在但指定方法不存在时,同样跳转至NotFound的index方法。
  • 给parseUrl补充默认返回空数组,避免无url参数时出现null引发的报错。
  • 在NotFound控制器中设置http_response_code(404),确保服务器返回标准的404错误状态码,让浏览器和搜索引擎正确识别。

内容的提问来源于stack exchange,提问作者user18803805

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:33:27