在 AWS 负载均衡器中将 http 转发到 https

Forwarding http to https in AWS Load Balancers

我正在使用 Elastic Beanstalk,我在我的 EB 负载均衡器中安装了我的 SSL 证书。每次服务器不健康时,负载平衡器都会删除实例并创建一个新实例,这意味着我将丢失我在实例中安装的重定向代码和 SSL 设置。

这就是我在负载平衡器上安装 SSL 的原因。但是,如何在负载平衡器上将 HTTP 重定向到 HTTPS?

我曾经通过将以下代码放入实例中进行重定向,但如果我继续这样做,当负载均衡器删除一个不健康的实例时,我将失去从 HTTP 到 HTTPS 的重定向。

我该怎么办?

<VirtualHost _default_:80>
  ServerName (domain).com
  ServerAlias www.(domain).com
  RedirectPermanent / https://www.(domain).com/
</VirtualHost>

<VirtualHost _default_:443>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} !^www\. [NC]
  RewriteRule ^(.*) https://www.%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
</VirtualHost>

更新

这是我在 EC2 中负载均衡器上的监听器

您需要在 Elastic Beanstalk 中设置您已获得 运行 的应用程序以配置 Http 到 Https 重定向。

然后在通过 Elastic Beanstalk 设置负载均衡器时创建 2 个侦听器,一个用于端口 80,一个用于端口 433,它们都转发。

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-alb.html

在 AWS 中使用负载均衡器时,常见的用例是在负载均衡器上安装 SSL 证书。这通常称为 SSL 卸载或第 7 层负载平衡。从负载均衡器到 EC2 实例的流量未加密,通常通过端口 80(有时是 8080)(HTTP)。从客户端到负载均衡器的流量由您创建的侦听器定义。

第 4 层负载平衡使用 TCP 与您的 EC2 实例通信,并且您在 Web 服务器上安装了 SSL 证书。然后您的 Web 服务器知道客户端正在连接的端口,以下不适用。

您的代码 运行 您的网站需要检查客户端是否使用 HTTPS 连接到负载均衡器。如果为真,则不要重定向客户端。如果客户端使用 HTTP 连接到负载平衡器,则重定向客户端。

以下 PHP 代码显示如何读取发送到您的 EC2 实例的负载均衡器 headers 以确定客户端是否通过 HTTPS 连接。如果您不使用 PHP 或 Nodes.js 等语言,您还可以创建知道如何读取正确 headers(底部示例)的 Apache 配置。

function require_ssl()
{
        global $config_require_ssl;

        if ($config_require_ssl == FALSE)
        {
                return;
        }

        if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']))
        {
                if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
                {
                       $_SERVER['HTTPS']='on';
                }
        }

        if(empty($_SERVER['HTTPS']) || $_SERVER["HTTPS"] != "on")
        {
                header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);

                exit();
        }
}

这是 Apache 的代码:

<VirtualHost *:80>
    RequestHeader set X-Forwarded-Proto "http"
    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    …
</VirtualHost>

您可以卸载应用程序负载均衡器 (ALB) 上的 SSL 流量和 ALB 之间的通信,并且可以使用 EC2 Web 服务器配置配置从 http 到 https 的重定向。

你是对的,如果没有 运行 服务器,重定向将不起作用。事实上,响应将是一个不同的错误,其中资源不可访问。如果您使用多个实例配置自动缩放和负载平衡,在大多数情况下,至少一个健康的实例应该能够进行重定向。