我是否需要在.htaccess文件中重复RewriteCond?

时间:2015-03-16 18:33:05

标签: apache .htaccess mod-rewrite redirect

我有三个域名 - domain.com domain.co.uk domain.ru 。我试图在一个.htaccess文件中实现以下重定向:

  • 应重定向所有请求以包含前缀 www。
  • 对(www。)domain.com的所有请求都应重定向到www.domain.co.uk
  • 应将http上的所有请求重定向为使用https

根据主持人提供的文档,有点搜索foo(并且非常头疼),我拼凑了以下内容:

Options +FollowSymLinks
RewriteEngine on

RewriteCond %{HTTP:X-Forwarded-SSL} !on

RewriteCond %{HTTP_HOST} (www\.)?domain\.(com|co.uk)$ [NC]
RewriteRule ^(.*)$ https://www.domain.co.uk/$1 [R=301,L]

RewriteCond %{HTTP_HOST} (www\.)?domain.ru$ [NC]
RewriteRule ^(.*)$ https://www.domain.ru/$1 [R=301,L]

它实际上似乎工作正常,但我真的不知道 RewriteCond%{HTTP:X-Forwarded-SSL}!在上做了什么,我想知道是否逻辑是有缺陷的。

由于主机上的设置,第一个条件为真,而第二个和第三个条件为假,不应该发生。但对于其他条件,我看到的方式是:

  • 如果第一个和第二个条件为真,则执行第一个规则;
  • 如果第一个条件为真,则第二个条件为假,但第三个条件为真,则执行第二个条件;

那么如果第一个条件是假的呢?会发生什么?逻辑是否忽略第二个条件并转到第三个条件,或者它是否会在该点退出?如果是这种情况,那么也许我应该在第一条规则之后重复第一个条件,那么它适用于两种情况吗?

有没有更好/更正/更简洁的方法呢?

1 个答案:

答案 0 :(得分:2)

先前规则与当前规则之间的条件适用于该规则。因此,在下面的示例中,#1,#2和#3彼此属于,#4和#5彼此属于。如果#1,#2和#3为真,则执行规则#3。如果#4和#5为真,则执行规则#5。我相信mod_rewrite首先评估RewriteRule的第一个参数,然后评估与该规则相关的任何条件。如果所有都为真(或者其中一些是真的,并且存在[OR]标志),则将根据RewriteRule的第二个参数重写该URL。

RewriteCond #1
RewriteCond #2
RewriteRule #3

RewriteCond #4
RewriteRule #5

关于条件RewriteCond %{HTTP:X-Forwarded-SSL} !on

检查X-Forwarded-SSL标头是否不存在。如果客户端使用HTTP与SSL联系您的外部服务器,则此标头将存在,并且外部服务器通过HTTP与内部服务器通信而不使用SSL。内部服务器不知道初始请求是否使用SSL,并且会将响应发送回外部服务器,然后发送回客户端以重定向到https。由于这已经是这种情况,这将导致无限循环。你可能不需要它,除非你专门设置它。如果只有部分连接被加密,那么如果有人使用未加密的流量访问网络,则可能容易受到窃听或限制攻击。