HTACCESS配置问题:如何处理PHP网站的虚假非存在页面
PHP网站虚假页面处理方案
问题情况
我自己开发了个PHP网站,现在出现了一堆显示首页内容的虚假页面——这些页面根本不存在。想通过配置.htaccess,让这些虚假页面返回404状态码,之后跳转到首页。
虚假页面示例:
/index.html?page=search&sRegion=Dublin /index.html?page=search&sRegion=Edinburgh https://www.example.com/?post_type=clients&p=1292
当前.htaccess配置
RewriteEngine On # 添加www前缀 RewriteCond %{HTTP_HOST} ^domain\.com$ RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] # 将.php请求外部重定向到.html RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^([^./]+?)\.php$ /$1.html [R=301,L,NC,NE] # 如果对应的php文件存在,将.html内部重写为.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.+?)\.html$ $1.php [L,NC] </IfModule> <FilesMatch ".(ico|css|flv|js|gif|jpeg|png|woff|woff2|eot|svg|ttf|webp)$"> Header set Cache-Control "max-age=604800, public, no-cache" </FilesMatch>
解决方法
要处理这些虚假页面,得在.htaccess的Rewrite规则最前面加上拦截无效查询参数的规则,先把它们拦下来:
1. 添加拦截规则
在RewriteEngine On之后,插入以下规则:
# 拦截带page=search的虚假index.html页面 RewriteCond %{QUERY_STRING} ^page=search(&.*)?$ [NC] RewriteRule ^index\.html$ /? [R=404,L] # 拦截根路径下带post_type=clients&p=数字的虚假页面 RewriteCond %{QUERY_STRING} ^post_type=clients&p=\d+(&.*)?$ [NC] RewriteRule ^$ /? [R=404,L]
规则解释
- 第一条规则:匹配所有
index.html后带page=search(不管后面有没有其他参数)的请求,返回404状态码并跳转到首页(/?用来清除查询参数)。 - 第二条规则:匹配根域名下带
post_type=clients和数字型p参数的请求,同样返回404并跳转首页。
整合后的完整配置
把拦截规则加进去后,最终的.htaccess是这样的:
RewriteEngine On # 拦截虚假页面:返回404并跳转首页 # 处理/index.html?page=search... RewriteCond %{QUERY_STRING} ^page=search(&.*)?$ [NC] RewriteRule ^index\.html$ /? [R=404,L] # 处理/?post_type=clients&p=... RewriteCond %{QUERY_STRING} ^post_type=clients&p=\d+(&.*)?$ [NC] RewriteRule ^$ /? [R=404,L] # 添加www前缀 RewriteCond %{HTTP_HOST} ^domain\.com$ RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] # 将.php请求外部重定向到.html RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^([^./]+?)\.php$ /$1.html [R=301,L,NC,NE] # 如果对应的php文件存在,将.html内部重写为.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.+?)\.html$ $1.php [L,NC] </IfModule> <FilesMatch ".(ico|css|flv|js|gif|jpeg|png|woff|woff2|eot|svg|ttf|webp)$"> Header set Cache-Control "max-age=604800, public, no-cache" </FilesMatch>
注意点
- 规则顺序不能乱,拦截虚假页面的规则必须放在最前面,确保先被处理。
R=404既会告诉搜索引擎这个页面不存在,也会把用户跳转到首页,兼顾SEO和用户体验。- 如果之后还有其他类型的虚假页面,照着这个逻辑加对应的规则就行。
内容的提问来源于stack exchange,提问作者carinho
相关产品推荐
相关产品推荐

