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

PHP路由开发:如何为错误URL路由实现404页面?

PHP基础路由404页面实现修复方案

你的问题出在单个路由匹配失败就立即触发404,而不是遍历完所有注册路由、确认无匹配项后再触发。以下是修复后的完整代码,核心改动是增加路由匹配标记,循环结束后统一判断是否触发404:

<?php

class Router{

    public static $routes = [];

    public static function get($route, $callback){
        self::$routes[] = [
            'route' => $route,
            'callback' => $callback,
            'method' => 'GET'
        ];
    }

    public static function resolve(){
        $path = $_SERVER['REQUEST_URI'];
        $httpMethod = $_SERVER['REQUEST_METHOD'];
        $routeFound = false; // 新增:标记是否找到匹配路由

        foreach(self::$routes as $route){
            // 转换路由为正则表达式
            $pattern = "@^" . preg_replace('/\\:[a-zA-Z0-9\_\-]+/', '([a-zA-Z0-9\-\_]+)', preg_quote($route['route'])) . "$@D";
            $matches = [];

            // 检查当前路由是否匹配
            if(preg_match($pattern, $path, $matches) && $httpMethod === $route['method']) {
                $routeFound = true; // 找到匹配路由,标记为true
                array_shift($matches);
                
                if(is_callable($route['callback'])){
                    call_user_func_array($route['callback'], $matches);
                }else{
                    self::render($route['callback']);
                }
                break; // 匹配到路由后跳出循环,避免无效遍历
            }
        }
      
        // 所有路由遍历完成后,若未找到匹配项则触发404
        if(!$routeFound){
            self::notFound();
        }
    }

    public static function render($file, $viewsFolder='./views/'){
        include($viewsFolder . $file);
    }

    public static function notFound(){
        http_response_code(404); // 修正:404才是资源未找到的标准状态码,原400为错误请求
        include('./views/404.php');
        exit();
    }
}

Router::get("/", "home.php");
Router::get("/user/:id", function($val1) {
    $data = ["Nicole", "Sarah", "Jinx", "Sarai"];
    echo $data[$val1] ?? "No data";
});

Router::get("/user/profile/:id", "admin.php");
Router::resolve();
?>

关键改动说明:

  1. 新增$routeFound变量作为匹配标记,初始为false,匹配到有效路由时设为true并跳出循环,避免无效遍历。
  2. 将notFound()调用移至循环外部,仅在所有路由检查完毕且无匹配项时执行。
  3. 修正HTTP状态码:将原400错误请求改为404资源未找到,符合HTTP规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:45:37