在.htaccess中配置RewriteRule使?p=类URL返回410 Gone失败,问题在哪?
为什么针对?p=773这类URL的410 Rewrite规则不生效?
我之前在另一框架下运营网站,部分形如?p=773的URL已被搜索引擎收录。我希望让这类URL返回410 Gone状态码,尝试了以下规则但未生效:
RewriteRule ^(\?p=773)$ - [G,L] RewriteRule ^(.*p=.*)$ - [G,L]
请问我遗漏了什么?
核心原因:RewriteRule不匹配查询字符串
Apache的RewriteRule默认仅匹配URL的路径部分(即域名后、?之前的内容),不会包含?开头的查询字符串。你写的规则试图在路径中匹配?p=xxx,但实际这些内容属于查询字符串,所以规则完全无法命中目标请求。
正确的规则写法
要匹配查询字符串,必须用RewriteCond捕获查询参数,再结合RewriteRule返回410状态码:
- 针对单个特定URL(如
?p=773)
RewriteCond %{QUERY_STRING} ^p=773$ RewriteRule ^ - [G,L]
%{QUERY_STRING}是Apache内置服务器变量,专门存储URL中的查询字符串内容。RewriteRule ^ -表示匹配任意路径,配合前面的条件,只要查询字符串严格等于p=773,就返回410。
- 匹配所有包含
p=的查询字符串
RewriteCond %{QUERY_STRING} p= RewriteRule ^ - [G,L]
这个规则会命中所有查询字符串中带有p=的请求,不管后续参数值是什么。
额外注意事项
- 确保这些规则放在
.htaccess文件的最顶部(或其他Rewrite规则之前),避免被其他规则提前拦截处理。 - 测试时可使用curl命令验证状态码:
curl -I "http://你的域名/?p=773"
查看输出中是否包含HTTP/1.1 410 Gone。
内容的提问来源于stack exchange,提问作者Ehsan88
相关产品推荐
相关产品推荐

