AWS Elastic Beanstalk:通过HTTPS重定向主机名

时间:2017-01-07 13:11:46

标签: amazon-web-services redirect https dns elastic-beanstalk

我有一个网站example.com,我希望对该主机名的所有请求都定向到https://www.example.com。它目前正在Elastic Beanstalk上的节点中运行。

我有以下解决方案可以重定向,但不确定如何执行第3步:

此外,这是最好的做事方式(或者有更好的方法来实现以下目标吗?)

1)http://example.com - > https://www.example.com(完成 - 通过A记录到S3存储桶 - example here)。

2)http://www.example.com - > https://www.example.com(已完成 - 通过expressJS中的HTTPS重定向 - example here)。

3)https://example.com - > https://www.example.com(我该怎么做?) - 这个电流给出一个ERR_CONNECTION_TIMED_OUT。

1 个答案:

答案 0 :(得分:4)

您可能希望以不同方式处理www子域和裸露的顶点。

1)http://example.com - > https://www.example.com

处理裸(apex)域重定向的最简单方法是进入Route53并设置顶点以使用A别名记录到S3存储桶目标。在S3存储桶中,您可以启用"将所有请求重定向到另一个域"并重定向到https://www.example.com

此解决方案仅适用于http请求,而不适用于https,因为S3不会因为https请求而终止SSL。有关适用于http和https的解决方案,请参阅#3。

2)http://www.example.com - > https://www.example.com

您可以使用相同的域名www http => https使用应用程序中的X-Forwarded-Proto HTTP标头重定向。它的值为httphttps。如果您收到http,则可以重定向到https

apache示例如下所示:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

nginx示例可能如下所示:

if ($http_x_forwarded_proto != "https") {
  rewrite ^(.*)$ https://$server_name$1 permanent;
}

或者,您可以使用Cloudfront安装Elastic Beanstalk应用程序并实现http => https重定向那里。在"行为设置"您可以选中单选按钮"将HTTP重定向到HTTPS"。

3)https://example.com - > https://www.example.com

您需要一个SSL证书,其主题备用名称涵盖example.com和www.example.com。您可以使用AWS Certificate Manager免费获得此信息。你可以"添加更多名字"这将允许您在单个证书中涵盖* .example.com和example.com。证书管理器与Cloudfront完全集成,因此它是一个不错的选择。

Cloudfront Option:

Cloudfront在这里是一个非常好的选择 - 特别是如果你使用它来支持整个应用程序(顶点和www)。

在Cloudfront中"替代域名(CNAME)"您需要同时添加example.com和www.example.com(用逗号或换行符分隔这些内容)。您还将指定涵盖这两个域的数字证书。

Elastic Beanstalk选项:

如果您不想使用Cloudfront,您可以在Elastic Load Balancer上终止SSL而不是apex和www,并使用您的应用层http服务(apache,nginx等)实现相同的!www redirect。只需添加涵盖两个域(顶点和www子域)的SSL证书。

实施非www重定向:

使用终止选项,您将收到https://example.com在Elastic Beanstalk上返回原始服务器的请求,但是您需要返回301,将浏览器定向到https://www.example.com at应用程序层。

一个apache示例:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

nginx示例:

server {
    server_name "~^(?!www\.).*" ;
    return 301 $scheme://www.$host$request_uri;
}

Apex的Route53别名记录:

使用任一解决方案,您都需要在顶点上使用Route53 A Alias记录才能使其工作,因为顶点(裸)域不支持CNAME记录。您可以指定Elastic Beanstalk目标或Cloudfront目标。