使用 htaccess 删除单个查询参数

Pet*_*SE4 4 regex .htaccess

由于不值得在这里讨论的原因,Google 一直在为我的一个网站建立索引,其中 URL 中包含不必要的查询字符串。我想将我的 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
Run Code Online (Sandbox Code Playgroud)

会成为

http://example.com/product.php
http://example.com/index.php?section=ABC123
http://example.com/search.php?term=keyword
Run Code Online (Sandbox Code Playgroud)

有效地剥离 'query=XXXXX' 加上 ? 或 &,但确保删除后保留其他查询并使用正确的语法(即,仅从第三个示例中删除 ?query=98765 是行不通的,因为它会将链接保留为 search.php&term=keyword 而不是 search .php?term=关键字)。

正在查看其他一些堆栈答案,发现了这个:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING}  (.*)?&?query=[^&]+&?(.*)?  [NC]
RewriteCond %{REQUEST_URI} /(.*)
RewriteRule .*  %3?%1%2? [R=301,L]
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,而且我对 htaccess 和正则表达式的了解还不足以找出原因。

预先感谢您的任何指点。

Jus*_*man 7

试试这个(我用你的例子测试了它,它工作正常):

RewriteEngine on

RewriteCond %{QUERY_STRING} ^(.*)&?query=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L,NE]
Run Code Online (Sandbox Code Playgroud)

另外,您应该添加一个条件以仅将此规则应用于现有文件(这取决于您)。
如果你想要的话:

RewriteEngine on
    
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{QUERY_STRING} ^(.*)&?query=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L,NE]
Run Code Online (Sandbox Code Playgroud)