基于引用者的htaccess 301重定向(if / else)

时间:2017-03-07 22:04:09

标签: apache redirect mod-rewrite

我已经看到其他已回答的问题,解释了如果引荐来源与一个或多个域匹配时如何重定向用户,但无法弄清楚如何以这样的方式执行此操作,如果他们被引用,则该人将被定向到站点A.域B和站点C,如果它们是从域D引用的。所有都应该是永久重定向。

所以这是我的代码:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://domainB.com [NC]
RewriteRule ^(.*)$ https://www.websiteA.co [R=301,L]

我猜伪代码会是这样的:

RewriteEngine On
if (RewriteCond %{HTTP_REFERER} !^http://domainB.com [NC]):
    RewriteRule ^(.*)$ https://www.websiteA.co [R=301,L] 
else if (RewriteCond %{HTTP_REFERER} !^http://domainD.com [NC]):
    RewriteRule ^(.*)$ https://www.websiteC.co [R=301,L]

我还需要确保它重定向来自该域的所有人,无论他们是来自根页还是任何其他(子)页面。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

由于Apache处理这些条件的方式,您不需要if else语句来获得所需的行为。如Apache mod_rewrite文档中所述:

  

可以使用一个或多个RewriteCond指令来限制类型   请求将受以下RewriteRule约束。

意味着RewriteRule仅适用于请求,如果它与之前的RewriteCond匹配,或者如果有多个RewriteCond,则必须将它们全部匹配。

  

如果指定了多个RewriteCond,则它们必须全部匹配   要应用的RewriteRule。

至于你使用L标志:

  

last | L 立即停止重写过程,不要申请任何重写过程   更多规则。

这可确保您的请求不会被任何其他规则处理。您的条件是互相排斥的,因此请求无论如何都不符合这两个条件。这将允许您编写.htaccess规则,如下所示:

RewriteEngine On

RewriteCond %{HTTP_REFERER} ^http://domainB\.com [NC]
RewriteRule ^(.*)$ https://www.websiteA.co$1 [R=301,L] 

RewriteCond %{HTTP_REFERER} ^http://domainD\.com [NC]
RewriteRule ^(.*)$ https://www.websiteC.co$1 [R=301,L]

这会导致任何传入的请求Referer: http://domainB.com被重定向到https://www.websiteA.co,任何带有Referer: http://domainD.com的传入请求都会被重定向到https://www.websiteC.co

这也会导致请求URI跨重定向保留。如果不需要,只需删除$1令牌。