我有一个特殊的用例,我需要将以几个关键字开头的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参数缓存有关。我已经让托管公司添加了一些缓存排除项,然后一切都按预期进行。
答案 0 :(得分:1)
尽管您的第二条规则是正确的,但我将不使用[QSA]
标志为您提供另一种解决方案:
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^(.+|.*)$
RewriteRule ^(test1|test2) ?utm_campaign=$1&%1 [R=302,L]
清除浏览器缓存,然后对其进行测试,如果可以,请用302
替换301
。
使用上述规则,服务器将重定向任何以test1或test2开头的URI,并检查是否存在查询字符串,然后将其附加在该重定向目标之后。