我需要将所有传入的HTTPstream量redirect到弹性负载均衡器上的HTTPS。
我厌倦了使用Apache mod_rewrite:
RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
利用负载均衡器添加的X-Forwarded-Proto头,该规则应该指示用户浏览器请求相同URL的HTTPS版本。
到目前为止它不工作(不发生redirect)。
我究竟做错了什么?
有一个更好的方法吗?
编辑:
这最终奏效了:
RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !=https RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
所以我假设你已经将ELB设置为接受HTTP / 80和HTTPS / 443上的stream量,但是都将端口转发到HTTP。
如果你想使用你的方法(这很聪明),你确定你得到的不是%{X-Forwarded-Proto} – HTTP:前缀对我来说看起来很奇怪。 除此之外,这看起来是正确的。
如果这是在虚拟主机或主服务器configuration,它仍然无法正常工作,您可以添加
RewriteLog rewrite-log RewriteLogLevel 3
然后查看文件rewrite-log来查看实际发生了什么。 这个文件可以非常详细,从较低的层次开始。 日志logging不能从.htaccess文件启动。
(我build议你在RewriteRule [R=301,L]上设置标志[R=301,L]这将使服务器发回一个301响应,告诉search引擎考虑redirect永久,并相应地更新其链接。
只是想增加我的经验,因为我在挣扎了好几个小时之后才意识到我的心跳文件里有一个没有转义的点(/alive.html)。 咄。
第二个问题是,主域名不是redirect,但文件是。 所以http://domain.com/hello.html被redirect到https://domain.com/hello.html ,但是http://domain.com不是。
以下是我为我工作的.htaccess文件中的内容:
RewriteEngine On # SSL connection forced RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{REQUEST_URI} !^/alive\.html$ RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
在我的情况下,问题原来是!https条件打破了健康检查。
改变条件^ ^ $使它的工作
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
发现这里: https : //forums.aws.amazon.com/thread.jspa?messageID=641930