如何在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
相关产品推荐
相关产品推荐

