301重定向中的MOD_REWRITE删除参数

时间:2017-08-24 作者:Daimko

我该如何重写:

http://www.example.com/?aff=number
收件人:

http://www.example.com
我要删除上的所有实例aff=x 无论URL中有多少其他参数。

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

我要删除上的所有实例aff=x 无论URL中有多少其他参数。

假设您想保留任何其他URL参数(按任何顺序),只需删除aff=number 参数,然后可以在根目录中使用mod\\u rewrite执行以下操作.htaccess 文件:

RewriteCond %{QUERY_STRING} ^(.*&|)aff=\\d+(?:&(.*)|)$
RewriteRule (.*) /$1?%1%2 [R=302,L]
这需要在现有WordPress指令之前执行。

这假设如果aff 参数存在时,其值仅为数字,且至少为1位。

这个$1 是对捕获的RewriteRule 图案。因此,这将处理任何URL路径,而不仅仅是文档根,如您的示例所示。

%1%2 是前一个CondPattern中捕获的组的反向引用。%1 是否在要删除的参数之前%2 在之后。两者都是可选的。

更改302 (临时)重定向到301 (永久性)只有在您确认其正常工作后(如果这是永久性的)。


UPDATE#1: 查询字符串包含%-编码字符

如果任何其他URL参数(要保留)包含URL编码的(%-编码)值,则需要添加NE (noescape) 标记到RewriteRule 指令,以防止这些字符在替换中被双重编码。例如:

RewriteRule (.*) /$1?%1%2 [NE,R=302,L]
TheQUERY_STRING Apache未对服务器变量进行%解码。通常,mod\\u rewrite URL在将响应发送回客户端之前对替换进行编码。但这将对我们从查询字符串中捕获的任何已编码字符进行双重编码。这个NE 标志可防止发生这种情况。


UPDATE#2: 要删除的URL参数值可以是任何内容。这个问题专门涉及删除URL参数aff 其中包含一个“数字”。通常,在处理regex时应该尽可能具体,但是,如果要删除的URL参数可以包含任何内容,那么请将CondPattern修改为类似以下内容之一

  • ^(.*&|)aff=.*?(?:&(.*)|)$ - 0个或更多字符的非贪婪匹配
  • ^(.*&|)aff=[^&]*(?:&(.*)|)$ - 匹配除& (URL参数分隔符)0次或更多次
这两个正则表达式中的重要一点是,匹配的值不能被捕获,即不能用普通括号括起来。

总而言之:

RewriteCond %{QUERY_STRING} ^(.*&|)aff=[^&]*(?:&(.*)|)$
RewriteRule (.*) /$1?%1%2 [NE,R=302,L]

结束

相关推荐