使用 AWS Elastic 负载均衡器强制使用 HTTPS

pan*_*nt0 7 http https amazon-web-services apache-2.2 amazon-elb

我需要将所有传入的 HTTP 流量重定向到我的弹性负载均衡器上的 HTTPS。

我厌倦了使用 Apache mod_rewrite:

 RewriteEngine On
 RewriteCond %{HTTP:X-Forwarded-Proto} !https
 RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
Run Code Online (Sandbox Code Playgroud)

利用负载均衡器添加的 X-Forwarded-Proto 标头,此规则应指示用户浏览器请求同一 URL 的 HTTPS 版本。

到目前为止它不起作用(没有重定向发生)。

我究竟做错了什么?

有一个更好的方法吗?

编辑:

这最终奏效了:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

Tom*_* Jr 5

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

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

如果这是在虚拟主机或主服务器配置中并且仍然无法正常工作,您可以添加

RewriteLog rewrite-log
RewriteLogLevel 3
Run Code Online (Sandbox Code Playgroud)

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

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

  • 很高兴你找到了一些有用的东西,但是除了裸露的 `R` 返回 http 302 状态之外,标志 `[L,R]` 应该没问题。标志的顺序应该无关紧要。更可能是关于 `RewriteRule` 的变化,它在 2 方面有所不同:1)它不会再将 http 请求重写为 `/status`,以及 2)它使用捕获组和反向引用(`(. *)` 然后是 `$1`) 而不是 `%{REQUEST_URI}` 变量。看看标志是否真的是原因,或者可能是其他原因,这可能对其他人有帮助。 (2认同)