如何修改htaccess重写规则将不存在的页面重定向至404页
方案说明
你的现有规则仅校验了请求路径对应的物理文件/目录不存在就触发转发,无法识别业务层面的pagename参数是否合法,所以需要htaccess规则优化 + PHP页面逻辑配合实现无效路径跳转404。
第一步:优化.htaccess规则
先修正原有规则的小瑕疵,避免路径匹配出错:
RewriteEngine ON ErrorDocument 404 /404.php # 现有PHP文件的重写规则优化 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.*)/?$ $1.php [NC,L] # hosting前缀路径转发 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^hosting/(.*)/?$ main-page.php?pagename=$1 [NC,L] # 其他路径转发 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/?$ sub-page.php?pagename=$1 [NC,L]
第二步:在PHP页面添加404判断逻辑
分别在main-page.php和sub-page.php的最顶部添加校验逻辑,判断传入的pagename是否为合法值,不合法则直接返回404:
<?php // 以下代码放在页面最顶部,不要有任何前置输出 $pagename = $_GET['pagename'] ?? ''; // 这里替换为你自己的合法页面校验逻辑,比如查询数据库、读取预定义的配置数组均可 $valid_pages = [ // main-page的合法值示例:'web-hosting', 'wordpress-hosting'等 // sub-page的合法值示例:'contact', 'about', 'services'等 ]; if (!in_array($pagename, $valid_pages)) { http_response_code(404); include($_SERVER['DOCUMENT_ROOT'].'/404.php'); exit; } // 原有页面业务逻辑写在下方 ?>
可选方案:仅适用于合法页面名称少且固定的场景
如果你的合法页面名称数量很少且不会频繁变更,可以直接在htaccess里写死匹配规则,不符合规则的请求会直接触发404,不需要PHP配合,但灵活性差,新增页面需要同步修改htaccess:
# 仅匹配hosting下的合法页面名称 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^hosting/(web-hosting|wordpress-hosting|vps-hosting)/?$ main-page.php?pagename=$1 [NC,L] # 仅匹配合法的子页面名称 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(contact|about|services)/?$ sub-page.php?pagename=$1 [NC,L]
内容的提问来源于stack exchange,提问作者user_59910105
相关产品推荐
相关产品推荐

