www.example.com/? to www.example.com/
以及
www.example.com/?i=xxxx to www.example.com/
使用此代码:
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^i=(.*)$
RewriteRule ^$ https://www.example.com/ [R=301,L]
或与此
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^i=(.*)$
RewriteRule ^$ / R=301,L]
但是当我重定向到新网站时,它会继续添加i=xxx
/?
至/
/?i=xx
至/
答案 0 :(得分:1)
RewriteRule ^$ https://www.example.com/ [R=301,L]
您需要在?
替换的末尾添加RewriteRule
(实际上是一个空查询字符串)。否则,如果您未指定查询字符串,则Apache会自动从请求中复制查询字符串。单个?
不会出现在目标上 - 查询字符串将被完全删除。例如:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^i=(.*)$
RewriteRule ^$ https://www.example.com/? [R=301,L]
此处不需要RewriteBase
指令,因为您没有使用相对替换。
注意:如果您使用WordPress,则应将(.*)
更改为[0-9]+
,否则可能会破坏某些内部功能,例如帖子预览。参考:https://xeedbeam.me/prevenir-contenido-duplicado-en-wordpress-con-htaccess-para-seo-parte-1/
或者 - 或者,在Apache 2.4+上,您可以改为使用QSD
(查询字符串丢弃)标志。
RewriteRule ^$ https://www.example.com/ [QSD,R=301,L]
在测试之前,您需要清除浏览器缓存。
<强>更新强>
我想将
/?
重定向到/
这有点棘手,因为您无法确定(仅使用QUERY_STRING
变量)查询字符串是否完全不存在(即没有?
)或只是空(使用{{ 1}}但之后没有任何内容)。但是,您可以检查包含实际请求标头的?
服务器变量(例如“THE_REQUEST
”)。例如:
GET /? HTTP/1.1
但是,这对搜索引擎来说不太可能是个问题。 <{1}}和RewriteEngine On
RewriteCond %{THE_REQUEST} ^GET\s/\?\sHTTP
RewriteRule ^$ /? [R=301,L]
应该同等对待。