在AWS Load Balancers中将http转发到https

时间:2018-07-13 19:48:43

标签: aws-load-balancer

我正在使用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中的负载均衡器上的监听器

enter image description here

3 个答案:

答案 0 :(得分:2)

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

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

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

以下PHP代码显示了如何读取发送到您的EC2实例的负载均衡器标头,以确定客户端是否通过HTTPS连接。如果您未使用PHP或Nodes.js之类的语言,则还可以创建知道如何读取正确标头的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>

答案 1 :(得分:0)

您需要设置在Elastic Beanstalk中运行的应用程序,以将Http配置为Https重定向。

然后,当通过Elastic Beanstalk设置负载均衡器时,为端口80创建两个侦听器,为端口433创建一个侦听器,这两个侦听器都将继续转发。

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

答案 2 :(得分:0)

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

您是对的,如果没有正在运行的服务器,重定向将无法进行。实际上,如果资源不可访问,响应将是一个不同的错误。如果您为多个实例配置自动缩放和负载平衡,则在大多数情况下,至少一个正常的实例应该能够进行重定向。