重定向和附加查询字符串参数

时间:2018-08-04 00:35:45

标签: .htaccess mod-rewrite url-rewriting

我有一个特殊的用例,我需要将以几个关键字开头的URL重定向到基本URL。

例如,我想重定向:

/ test1到/?utm_campaign = test1

/ test2到/?utm_campaign = test2

使用以下规则可以正常工作:

RewriteEngine On
RewriteBase /
RewriteRule ^(test1|test2) ?utm_campaign=$1 [R=301,L]

但是我也想保留其他查询字符串参数,所以:

/ test1?utm_content = abc应该重定向到/?utm_campaign = test1&utm_content = abc

我已经在QSA(可在Chrome浏览器中使用,但不能在Safari中使用)上尝试过

RewriteEngine On
RewriteBase /
RewriteRule ^(test1|test2) ?utm_campaign=$1 [R=301,L,QSA]

Chrome正确地将其重定向,但是Safari仅将其重定向到/?utm_campaign = test1

我还尝试将完整的查询字符串添加到目标URL,如下所示: /?utm_campaign = test1&q =

使用以下规则,这也适用于Chrome浏览器,但不适用于野生动物园:

RewriteEngine On
RewriteBase /
RewriteRule ^(test1|test2) ?utm_campaign=$1&q=%{QUERY_STRING} [R=301,L]

有什么想法如何将查询字符串参数附加到目标URL?

编辑:该问题并非与重写规则有关,而是与托管端的url参数缓存有关。我已经让托管公司添加了一些缓存排除项,然后一切都按预期进行。

1 个答案:

答案 0 :(得分:1)

尽管您的第二条规则是正确的,但我将不使用[QSA]标志为您提供另一种解决方案:

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^(.+|.*)$
RewriteRule ^(test1|test2) ?utm_campaign=$1&%1 [R=302,L]

清除浏览器缓存,然后对其进行测试,如果可以,请用302替换301

使用上述规则,服务器将重定向任何以test1或test2开头的URI,并检查是否存在查询字符串,然后将其附加在该重定向目标之后。