使用.htaccess和纯PHP修复路径匹配异常未触发404错误的问题
问题原因
你当前的重写规则使用的是模糊匹配逻辑,只要请求路径中包含home、about关键词就会命中对应规则,不会触发404逻辑,所以会出现homesss、about/a/b/c这类路径无法返回404的问题。
修复方案
第一步:调整.htaccess重写规则
给匹配规则添加正则起止符^(匹配路径开头)和$(匹配路径结尾),实现精确路径匹配,同时推荐添加L(命中后停止匹配后续规则)、QSA(自动保留原请求的查询参数)标识:
RewriteEngine On Options +FollowSymLinks # 404页面建议用相对路径,避免额外的302跳转 ErrorDocument 404 /page-not-found.html # 仅精确匹配 /home 路径 RewriteRule ^home$ index.php?c=home&m=main [QSA,L] # 仅精确匹配 /about 路径 RewriteRule ^about$ index.php?c=home&m=about [QSA,L]
如果后续需要支持/about/xxx这类带后缀的路径,可根据需求调整正则规则,比如匹配所有以about开头的路径可以写成^about(/.*)?$。
第二步:PHP层加404兜底校验(可选,更稳妥)
因为是纯PHP开发,可以在入口文件index.php中增加控制器和方法的存在性校验,避免异常参数请求返回错误内容:
<?php // 获取路由参数 $controller = $_GET['c'] ?? ''; $method = $_GET['m'] ?? ''; // 校验路由合法性,不存在则返回404 $controllerFile = __DIR__ . "/controller/{$controller}.php"; if (!file_exists($controllerFile)) { http_response_code(404); require __DIR__ . '/page-not-found.html'; exit; } require_once $controllerFile; if (!class_exists($controller) || !method_exists($controller, $method)) { http_response_code(404); require __DIR__ . '/page-not-found.html'; exit; } // 后续正常执行路由逻辑
内容的提问来源于stack exchange,提问作者Van
相关产品推荐
相关产品推荐

