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

使用 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]

答案1

因此,我假设您已将 ELB 设置为接受 HTTP/80 和 HTTPS/443 上的流量,但将所有端口转发到 HTTP。

如果您想使用您的方法(这很聪明),您确定您得到的结果不是%{X-Forwarded-Proto}——HTTP:前缀对我来说看起来很奇怪。除此之外,这对我来说看起来是正确的。

如果这是在虚拟主机或主服务器配置中,并且仍然不起作用,您可以添加

RewriteLog rewrite-log
RewriteLogLevel 3

然后查看文件rewrite-log以查看实际发生的情况。此文件可能非常冗长,请从较低级别开始。无法从.htaccess文件启动日志记录。

(我建议您制作标志,RewriteRule [R=301,L]这将导致服务器发回 301 响应,告诉搜索引擎将重定向视为永久性的,并相应地更新其链接。)

答案2

我只是想补充一下我的经历,因为我挣扎了好几个小时才意识到我的心跳文件中有一个未转义的点 (/alive.html)。呃。

第二个问题是主域名没有重定向,但文件重定向了。所以http://domain.com/hello.html正在重定向至https://domain.com/hello.html, 但http://域名.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]

答案3

就我而言,问题在于 !https 条件破坏了健康检查。

将条件更改为 ^http$ 使其起作用

RewriteCond %{HTTP:X-Forwarded-Proto} ^http$

发现这里: https://forums.aws.amazon.com/thread.jspa?messageID=641930

相关内容