使用RewriteRules在执行顺序中发出问题

时间:2014-11-21 09:32:03

标签: apache .htaccess mod-rewrite redirect vanity-url

由于营销原因,我使用一些虚荣网址进行更友好的访问,并跟踪某些广告系列。不幸的是,我使用cPanel停留在托管专用服务器上,这些是我编写规则的步骤:

  • 首先,我将xyz.comefg.com添加到我的cPanel中的托管域
  • 然后我写了我需要的所有RewriteRule

的.htaccess

RewriteCond %{HTTP_HOST} ^xyz\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.xyz\.com$
RewriteRule ^signdirections$ "http\:\/\/xyz\.abc\.com\/en?utm_source=signdirections&utm_medium=advert&utm_campaign=xyz" [R=301,L]


RewriteCond %{HTTP_HOST} ^efg\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.efg\.com$
RewriteRule ^signdirections$ "http\:\/\/efg\.abc\.com\/en?utm_source=signdirections&utm_medium=advert&utm_campaign=efg" [R=301,L]

现在问题是,如果我尝试访问www.efg.com/signdirections,我会被重定向到www.xyz.com/signredirections版本,而不是efg的版本。

任何想法,为什么会这样?我的直觉是,它检测到相同的主机名(HTTP_HOST),但我不明白为什么。

2 个答案:

答案 0 :(得分:2)

由于您的其他规则,很可能会发生这种情况。最好使用在应用其他规则后不会发生变化的THE_REQUEST变量。

您还可以将两个规则合并为一个:

RewriteCond %{HTTP_HOST} ^(?:www\.)?(xyz|efg)\.com$ [NC]
RewriteCond %{THE_REQUEST} /signdirections [NC]
RewriteRule . http://%1.abc.com/en?utm_source=signdirections&utm_medium=advert&utm_campaign=%1 [R=301,L,NE,QSA]
  • 确保这是RewriteEngine On行以下的第一条规则。
  • 请务必在新浏览器中对其进行测试,以避免旧的浏览器缓存。

答案 1 :(得分:0)

我不知道,如果在测试结果不好后可能出现缓存错误:
How long do browsers cache HTTP 301s?

只是一个简化版本:

RewriteCond %{HTTP_HOST} ^(?:www\.)?xyz\.com$
RewriteRule ^signdirections$ http://xyz.abc.com/en?utm_source=signdirections&utm_medium=advert&utm_campaign=xyz [R=302,L]

RewriteCond %{HTTP_HOST} ^(?:www\.)?efg\.com$
RewriteRule ^signdirections$ http://efg.abc.com/en?utm_source=signdirections&utm_medium=advert&utm_campaign=efg [R=302,L]

尝试使用R = 302,当一切正常时,更改为R = 301