.htaccess 301 重定向 URL 忽略其参数

.htaccess 301 重定向 URL 忽略其参数

文件重定向

Redirect 301 /products.php http://example.com/product_123.php

和域名重定向

Redirect 301 / http://www.example.com/

很容易。但是,我想重定向一些 URL 并忽略所有参数,即

example.com/slug1/slug2/slug3?pagination=1
example.com/slug1/slug2/slug3?ref=2
example.com/slug1/slug2/slug3?day=Monday
example.com/slug1/slug2/slug3?referer=Google 
example.com/slug1/slug2/slug3?referer=Facebook
... etc  

应该全部重定向到

example.com/slug4

答案1

这时候你应该使用RedirectMatch指令与正则表达式匹配,而不是简单的Redirect

可能是这样的:

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

答案2

如果你想简单地忽略所有参数,那么你仍然可以使用标准Redirect,因为它是前缀匹配并且无论如何都与查询字符串不匹配。例如:

Redirect 301 /slug1/slug2/slug3 /slug4

上述操作Redirect将把问题中的所有 URL(即所有以 开头的 URL /slug1/slug2/slug3)301 重定向到/slug4

但是,请求的 URL 上的任何查询字符串也将不加改变地传递到目标 URL。因此,/slug1/slug2/slug3?ref=2将被重定向到/slug4?ref=2。如果这是不希望的,并且您希望完全删除查询字符串*1,那么您将需要使用 mod_rewrite (即RewriteRule),而不是 mod_alias (即RedirectRedirectMatch,如另一个答案中所建议的),以便明确地从目标 URL 中完全删除查询字符串。例如:

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

替换末尾的?RewriteRule导致查询字符串从目标 URL 中删除(您也可以QSD在 Apache 2.4+ 上使用该标志)。查询字符串与RewriteRule 图案,因此在这方面您不需要做任何额外的事情,除非您需要匹配特定的查询字符串,或者只有当实际存在查询字符串时(无论是否存在查询字符串,上述内容都会匹配)。

切换到 mod_rewrite 重定向的另一个注意事项是,最好将任何现有的 mod_alias 重定向更改为等效的 mod_rewrite 语法。这是为了避免任何潜在的冲突,因为两个模块在不同时间执行。

*1请注意,您可以简单地使用或指令?在目标 URL 末尾附加一个(即一个空查询字符串)。但是,尾随部分实际上包含在重定向 URL 中,而不是像 mod_rewrite指令那样被完全删除。RedirectRedirectMatch?RewriteRule

相关内容