您可能希望这仅针对机器人,可能通过匹配用户代理:
RewriteCond %{HTTP_USER_AGENT} (googlebot|google-mobile) [NC]
如果要将所有包含查询字符串的 URL 剥离为裸 URL,可以使用以下方法:
RewriteCond %{QUERY_STRING} .
RewriteRule ^ %{REQUEST_URI} [L,R=301,QSD]
如果你只想重定向一个特定的查询字符串组件,比如n=foo:
RewriteCond %{QUERY_STRING} (^|&)n=(.+)(&|$)
RewriteRule ^ %{REQUEST_URI} [L,R=301,QSD]
如果您使用的 apache 版本早于 2.4 且不支持 QSD 标志,只需将 ? 附加到 %{REQUEST_URI} 即可。
编辑 1:
这很奇怪。此 URI 中的查询字符串:
https://www.MyShop.com/648-category-name?%252525252525253Bn=10
包含一个分号;,它是percent-encoded 转换为%3B,但百分号% 又一次又一次地编码为%25。
如果不解决如何解决该特定问题,您可以修改我上面提到的正则表达式以匹配百分比编码:
RewriteCond %{QUERY_STRING} (^|&)([%A-Za-z0-9]+)n=(.+)(&|$)
或者一个更简单的,如果稍微不那么有针对性:
RewriteCond %{QUERY_STRING} (^|&)(.+)n=(.+)(&|$)
但这也将匹配任何碰巧以n=结尾的查询字符串组件,所以这个URI:
https://www.MyShop.com/648-category-name?somethingn=foo&id_category=42
也会被捕获。
由于您只针对机器人,最好完全去除查询字符串。如果这只是网站特定部分的问题,您还可以通过将这些重写规则放在 location 块中来缩小网站上适用的位置:
<location /648-category-name>
RewriteCond %{HTTP_USER_AGENT} (googlebot|google-mobile) [NC]
RewriteCond %{QUERY_STRING} . # Or any of the other regexes
RewriteRule ^ %{REQUEST_URI} [L,R=301,QSD]
</location>
对此的替代方案可能对您可行,也可能不可行,如在this answer 中解释的那样添加rel="canonical" meta tag,或在您的robots.txt 中添加Disallow: /*?* 以停止对带有查询的页面的所有抓取字符串,如this answer 中所述。
编辑 2:
有更有效的方法来编写这些规则。
多个条件,以apache[OR] flag分隔:
RewriteCond %{QUERY_STRING} (^|&)n=10(.+)(&|$) [OR]
RewriteCond %{QUERY_STRING} (^|&)n=20(.+)(&|$) [OR]
RewriteCond %{QUERY_STRING} (^|&)n=50(.+)(&|$) [OR]
RewriteCond %{QUERY_STRING} (^|&)amp%(.+)(&|$) [OR]
RewriteCond %{QUERY_STRING} (^|&)%25252525(.+)(&|$)
RewriteRule ^ %{REQUEST_URI} [L,R=301,QSD]
作为单个条件,使用正则表达式| operator:
RewriteCond %{QUERY_STRING} (^|&)n=(10|20|50|amp%|%25)(.+)(&|$)
RewriteRule ^ %{REQUEST_URI} [L,R=301,QSD]
出于高流量网站的性能原因,这可能很重要。