使用htaccess删除单个查询参数

时间:2014-02-18 14:49:22

标签: regex .htaccess

由于不值得进入的原因,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;正则表达式不足以弄明白为什么。

提前感谢任何指示。

2 个答案:

答案 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]

此代码仅删除一个参数。工作完美。