我有三个域名 - domain.com , domain.co.uk 和 domain.ru 。我试图在一个.htaccess文件中实现以下重定向:
根据主持人提供的文档,有点搜索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}!在上做了什么,我想知道是否逻辑是有缺陷的。
由于主机上的设置,第一个条件为真,而第二个和第三个条件为假,不应该发生。但对于其他条件,我看到的方式是:
那么如果第一个条件是假的呢?会发生什么?逻辑是否忽略第二个条件并转到第三个条件,或者它是否会在该点退出?如果是这种情况,那么也许我应该在第一条规则之后重复第一个条件,那么它适用于两种情况吗?
有没有更好/更正/更简洁的方法呢?
答案 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。由于这已经是这种情况,这将导致无限循环。你可能不需要它,除非你专门设置它。如果只有部分连接被加密,那么如果有人使用未加密的流量访问网络,则可能容易受到窃听或限制攻击。