由于不值得进入的原因,Google一直在使用网址中不必要的查询字符串为我的某个网站编制索引。我想将我的htaccess文件修改为301将所有这些请求重定向到URL而不需要查询字符串中不需要的部分,但保留查询字符串的任何其他部分,这些部分可能(或可能不)是要创建的地址的一部分确保保留其他功能。
例如,以下网址
http://example.com/product.php?query=12345
http://example.com/index.php?section=ABC123&query=56789
http://example.com/search.php?query=987654&term=keyword
会变成
http://example.com/product.php
http://example.com/index.php?section=ABC123
http://example.com/search.php?term=keyword
有效剥离'query = XXXXX'加上?或者&,但确保在删除后保留其他查询并使用正确的语法(即,从第三个示例中删除?query = 98765将不起作用,因为它会将链接保留为search.php& term = keyword而不是search.php?term = keyword)。
正在浏览其他一些Stack答案,并发现了这个:
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} (.*)?&?query=[^&]+&?(.*)? [NC]
RewriteCond %{REQUEST_URI} /(.*)
RewriteRule .* %3?%1%2? [R=301,L]
但这似乎不起作用,而且我对htaccess& amp;正则表达式不足以弄明白为什么。
提前感谢任何指示。
答案 0 :(得分:4)
试试这个(我用你的例子测试它并且工作正常):
RewriteEngine on
RewriteCond %{QUERY_STRING} ^(.*)&?query=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L]
此外,您应该添加一个条件,仅将此规则应用于现有文件(由您决定)。
如果你想要它:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{QUERY_STRING} ^(.*)&?query=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L]
答案 1 :(得分:2)
似乎有错误或其他错误。这是有效的解决方案:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^(.*)&?query=[^&]+&?(.*)$ [NC]
RewriteRule ^(.*)$ /$1?%1%2 [R=301,L,NE]
此代码仅删除一个参数。工作完美。