使用AWS弹性负载均衡器强制启用HTTPS

我需要将所有传入的HTTP流量重定向到我的弹性负载均衡器上的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版本。
到目前为止,它没有生效(没有重定向发生)。
我做错了什么?
有更好的方法吗?
编辑:
最终这个方法成功了:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
3个回答

所以我假设您已经将ELB设置为接受HTTP/80和HTTPS/443上的流量,但是将所有流量都转发到HTTP。
如果您想使用您的方法(这很聪明),您确定得到的不是%{X-Forwarded-Proto}吗?对我来说,HTTP:前缀看起来有点奇怪。除此之外,这看起来对我来说是正确的。
如果这是在虚拟主机或主服务器配置中,并且仍然无法正常工作,您可以添加
RewriteLog rewrite-log
RewriteLogLevel 3

然后查看文件rewrite-log以了解实际情况。这个文件可能会非常冗长,可以从较低级别开始。无法从.htaccess文件中启动日志记录。
(我建议您在RewriteRule上使用标志[R=301,L],这将导致服务器发送一个301响应,告诉搜索引擎将重定向视为永久性,并相应地更新其链接。)

谢谢答案,看起来[R=301,L]是解决方案的一部分。 - panos2point0
2很高兴你找到了有效的解决方法,但是除了裸露的R返回一个HTTP 302状态之外,标志[L,R]应该是可以的。标志的顺序不应该有影响。更可能的是关于RewriteRule的变化,有两个方面不同:1)它不再重写对/status的HTTP请求,2)它使用捕获组和反向引用((.*)然后$1)而不是%{REQUEST_URI}变量。对于其他人来说,如果能看到这些标志是否真的是原因,或者可能是其他原因,可能会有所帮助。 - Tom Harrison Jr
1我觉得我已经缩小范围,确定使用"!="而不是"!"。 - panos2point0
HTTP:X-Forwarded-Proto和X-Forwarded-Proto对我都有效。 - jaredsten

只是想分享一下我的经验,我在苦苦挣扎了几个小时后才意识到我的心跳文件中有一个未转义的句点(/alive.html)。真是天啊。
第二个问题是主域名没有重定向,但文件有。所以 http://domain.com/hello.html 重定向到了 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]