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(); ?>
关键改动说明:
- 新增
$routeFound变量作为匹配标记,初始为false,匹配到有效路由时设为true并跳出循环,避免无效遍历。 - 将
notFound()调用移至循环外部,仅在所有路由检查完毕且无匹配项时执行。 - 修正HTTP状态码:将原400错误请求改为404资源未找到,符合HTTP规范。
内容的提问来源于stack exchange,提问作者mitas1c
相关产品推荐
相关产品推荐

