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