对于托管在 CloudFront 后面的 EC2 实例上的站点,如何将非 www 流量重定向到 www?

Posted

技术标签:

【中文标题】对于托管在 CloudFront 后面的 EC2 实例上的站点,如何将非 www 流量重定向到 www?【英文标题】:How to redirect non-www traffic to www for site hosted on EC2 instance behind CloudFront? 【发布时间】:2018-06-20 04:42:10 【问题描述】:

我在 CloudFront 后面的单个 EC2 实例上托管了一个站点,并且需要将所有非 www 流量重定向到 www。

从这里的其他问答中,我能够在 Route53 上配置一条 A 记录,以将流量从 example.com 重定向到 www.example.com。但是,这仅适用于 http 流量,不适用于 https 流量。

如何让裸(非 www)URL 的 https 流量重定向到我的规范 URL https://www.example.com?

我知道已经有人问过类似的问题,但我没有看到任何具有相同配置的问题(大多数用于托管在 S3 存储桶中的网站或用于从 www 重定向到非 www)。

目前的网址处理情况

https://www.example.com - Canonical URL for the site, handled by CloudFront
http://www.example.com - CloudFront redirects to https://www.example.com
https://example.com - Unreachable!!!
http://example.com - Route53 redirects to https://www.example.com via S3 bucket

其他详情

CloudFront 分配使用 AWS 生成的证书,该证书涵盖以下域:

*.example.com
example.com

分发中列出的备用域名 (CNAME) 是:

www.example.com
example.com

Route53有以下A记录:

www.example.com -> CloudFront distribution
example.com -> S3 bucket, configured to redirect to www.example.com

【问题讨论】:

【参考方案1】:

就像我在this answer to a slightly different question 中描述的那样,解决方案是在一个空存储桶前面为您要重定向的域名变体创建第二个 CloudFront 分配。

将存储桶配置为重定向,当您将第二个 CloudFront 分配配置为指向该重定向存储桶时,请确保您输入存储桶的网站托管端点——不要从源域名中选择存储桶下拉列表。

从现有发行版的备用域名设置中删除 example.com,并在新发行版上进行配置。

您可以在两个发行版上使用相同的 ACM 证书。

example.com 指向 DNS 中的新 CloudFront 分配。

【讨论】:

对于第二个(重定向)CloudFront 分配,是否应该使用默认的查看器协议策略“HTTP 和 HTTPS”? 重定向分发的 CNAME 是否应该是 example.com 而网站分发的 CNAME 应该是 www.example.com? 对于重定向,查看器协议策略 HTTP 和 HTTPS 可能会将重定向次数减少 1,因为将所有 HTTP 重定向到 HTTPS 会在您想要的重定向之前添加一个不必要的额外重定向,并且仅 HTTPS不适用于此应用程序。是的,备用域名(“CNAME”)设置应如您所述。 但是 S3 不能处理 HTTPS 流量对吧?因此,如果我将 HTTP 和 HTTPS 流量从 CloudFront 重定向到 S3 重定向存储桶,那么 HTTPS 流量如何从 S3 到达我的网站分配? 您询问了 Viewer 协议策略。这只是在查看器和 CloudFront 之间,而不是在 CloudFront 和 S3(或任何源服务器)之间。 CloudFront 将通过 HTTP 向 S3 发送后端请求,同时使用浏览器使用 HTTP 或 HTTPS,并(因为没有更好的词)在两者之间进行转换。【参考方案2】:

简短的回答是:没有好办法。 (就我个人而言,我不认为 hacky 变通办法是一种解决方案。)

长答案是:

没有好办法,但有办法。我猜。

我在他们的论坛中看到了 AWS 员工推荐的 S3 和 EC2。正如您所指出的,S3 是非选项。在 route53 或 cloudfront 可以处理此问题之前,EC2 可能是最“正确”的。

    创建一个 ec2 Web 服务器并安装适用于 example.com (letsencrypt) 的 ssl 将其配置为重定向 example.com -> www.example.com 添加指向 ec2 服务器的 A 记录 (这不起作用,因为 EC2 不支持公共 IPv6)添加指向 ec2 服务器的 AAAA 记录

您可能可以跳过 IPv6 支持而侥幸,但如果您需要它,ELB 会支持它——所以玩得开心。

【讨论】:

【参考方案3】:

您需要另外一个云端分发版,所以总共有 2 个云端分发版。 然后,您不需要任何 s3 存储桶。只需使用 2 个云端发行版。最后,您配置 route 53

这是下面的说明↓↓↓

第 1 步:创建第一个云端分发。

配置:

Origin Domain Name : "www.example.com"

Viewer Protocol Policy : "Redirect HTTP to HTTPS"

Cache Policy : "Managed-CachingDisabled" (Default is "Managed-CachingOptimized")

Alternate Domain Names(CNAMEs) : "example.com"

then, select "Custom SSL Certificate".

第 2 步:创建第二个云端分发。

配置:

Origin Domain Name : "33.72.129.67" (Input your ec2 instance public ip like this)

Viewer Protocol Policy : "Redirect HTTP to HTTPS"

Alternate Domain Names(CNAMEs) : "www.example.com"

then, select "Custom SSL Certificate".

第 3 步:将第一个(第 1 步的)云端分发分配给路由 53 上的“example.com”。

第 4 步:将第二个(第 2 步的)云端分发分配给路线 53 上的“www.example.com”。

就是这样!!

补充说,您不能将 cloudfront 连接到私有子网中的 ec2 实例。公共子网中的ec2实例可以连接到云端。

【讨论】:

以上是关于对于托管在 CloudFront 后面的 EC2 实例上的站点,如何将非 www 流量重定向到 www?的主要内容,如果未能解决你的问题,请参考以下文章

EC2 在 CloudFront 后面使用 HTTPS 运行 NGINX?

用于 PHP 托管的 AWS CloudFront

AWS 将 EC2 替换为 CloudFront

如何使用 EC2 网站设置 Cloudfront

我需要亚马逊的 EC2、Cloudfront、RDS 吗?

将 AWS cloudfront 放在 ec2 前面会引发 502 错误