.htaccess 301redirectURL忽略其参数

文件redirect
Redirect 301 /products.php http://domain1.com/product_123.php

和域redirect
Redirect 301 / http://www.domain2.com/

很容易。 但是,我想redirect一些URL,忽略所有参数,即domain1.com/slug1/slug2/slug3?pagination=1
domain1.com/slug1/slug2/slug3?ref=2
domain1.com/slug1/slug2/slug3?day=Monday
domain1.com/slug1/slug2/slug3?referer=Google
domain1.com/slug1/slug2/slug3?referer=Facebook
等等
应该都redirect到
domain1.com/slug4

这就是您应该使用RedirectMatch指令与正则expression式匹配而不是纯Redirect

也许是这样的:

  RedirectMatch 301 "/slug1/slug2/slug3(.*)$" "/slug4" 

如果你想忽略“所有参数”,那么你仍然可以使用一个标准的Redirect ,因为它是前缀匹配 (而且与查询string无关)。 例如:

 Redirect 301 /slug1/slug2/slug3 /slug4 

上面的Redirect/slug1/slug2/slug3redirect问题中的所有URL(即所有启动/slug1/slug2/slug3 )到/slug4

但是,请求的URL上的任何查询string也将被传递到目标不变。 所以, /slug1/slug2/slug3?ref=2会被redirect到/slug4?ref=2 。 如果这是不可取的,那么你将需要使用mod_rewrite(即RewriteRule ),而不是mod_alias(即Redirect ),以显式地从目标URL中完全删除查询string。 例如:

 RewriteEngine On RewriteRule ^slug1/slug2/slug3$ /slug4? [R=301,L] 

这个?RewriteRulereplace的结尾将导致查询string被从目标URL中删除(也可以使用Apache 2.4+中的QSD标志)。 查询string与RewriteRule 模式不匹配,所以除非需要匹配特定的查询string,或者只有当实际上有查询string时,才需要做额外的事情(不pipe查询string是否匹配是否存在)。

切换到mod_rewriteredirect的一个额外的警告是,你应该理所当然地改变任何现有的mod_aliasredirect到mod_rewrite语法。 这是为了避免任何潜在的冲突,因为这两个模块在不同的时间执行。