Cloudfront使用ssl将www重定向到裸域[关闭]


75

原谅我是否曾经被问过,有很多资源可以解决这个问题,但是似乎没有什么适合我的特定(https)用例。

我正在尝试将https://www.example.com重定向到https://example.com。同样,这应该适用于http://www.example.comhttps://example.com

我已经建立了一个以s3存储桶为源的cloudfront发行版,将http重定向到https,添加了cname example.com并添加了我的域证书(适用于www子域以及裸域)。

我还建立了一个单独的发行版,其www.example.com的名称为cname,添加了证书并将源设置为单独的s3存储桶,该存储桶中的(静态网站托管)将所有请求重定向到https://example.com

重定向按预期从http://example.com重定向到https://example.com,但是从http(s)://www.example.com重定向到https://example.com却没有。

在路由53中,我将根域别名化为第一个cloudfront分发,将www别名化为第二个。


请在这里查看我的答案,这应该会很有帮助:stackoverflow.com/questions/36265027/…–
Marcel

6
除了解决这个问题,我们还可以将其移到“服务器故障”吗?我想补充一个答案。
2540625 '18

+1 @jtheletter的建议。仅作记录,我写了一篇有关如何使用S3,CloudFront和Route53设置静态网站的深入教程。它描述了用于正确处理www子域的基本AWS基础设施。
Paul Razvan Berg

Answers:


103

要将网站托管在AWS上,以便:

https://www.example.com、http://www.example.com和http://example.com都重定向到https://example.com

你需要:

  1. 创建两个名为S3的S3存储桶:example.comwww.example.com

  2. 在这两个存储桶上打开“静态网站托管”。

  3. 将存储桶www.example.com中的重定向配置为:https : //example.com。在存储桶属性中,选择“静态网站托管=>将所有请求重定向到另一个主机名”。在“目标存储桶或域”字段中,输入example.com,在“协议”字段中,输入https

  4. 为这些存储桶创建两个CloudFront分配。每个分布都指向相应的存储桶:

  5. 对于“原始域名”,请提供“静态网站托管”部分中提供的存储段网址。网址应采用以下格式(或类似格式):example.com.s3-website-us-west-1.amazonaws.com

    • 在两个发行版上,将HTTP设置为HTTPS重定向。

    • 请勿使用AMAZON自动完成建议的网址!

    • 不要设置默认的根对象属性!

  6. 通过为www.example.com和example.com设置A记录以指向相应的CloudFront发行版来配置DNS。

为什么行得通?在两种情况下(带有和不带有www),CloudFront都提供从HTTP到HTTPS的重定向。www.example.com的存储桶提供了指向example.com的重定向。如果您没有此分发版本,则存储桶将无法重定向对https://www.example.com的请求。S3本身不支持用于静态网站托管的HTTPS。


16
不要在www-> naked CF分发上将HTTP设置为HTTPS重定向,以避免不必要的重定向。您希望example.com直接转到example.com,而不要首先转到example.com
maletor

请勿在53上为www设置A记录。使用CNAME。将ALIAS用于​​根域上的A和AAAA记录。
maletor

7
还值得注意的是,仅在www.example.com上使用CNAME指向example.com不会重定向。相反,www.example.com将显示与example.com相同的内容,但并不相同。
ffxsam

1
因此,我的解决方案是将www.mydomain.com存储桶重定向到domain.com并将协议设置为https。在每个Cloudfront中(即www.mydomain.com和mydomain.com),我将CNAME分别设置为www.mydomain.com和mydomain.com。完成此操作后,在S3中,我可以选择适当的Cloudfront作为A记录的别名。如上所述,我没有使用自动完成建议的URL-我使用了静态网站的主机名-也没有设置默认的root属性。
山姆·肯尼

2
为什么没有人解释说您需要为每次重定向安装SSL证书,以防止浏览器发出“不安全”警告?它的基本原理,但像我这样的人“仅仅是开发人员”并不知道。我花了几天的时间来解决它,直到发现这个建议...
Philip Enc

57

由于以下答案,我找到了解决方案:Amazon S3 Redirect和Cloudfront

简而言之:

如果源仅是存储桶ID,则Cloudfront不遵守S3中的重定向规则设置。相反,我必须将来源设置为提供的s3静态网站主机名。


7
非常感谢您发布答案。我用它来获取HTTPS从裸域到www的重定向,例如https : //example.com- > https://www.example.com。该解决方案是违反直觉的,因为AWS UI自动完成为标准S3主机名(bucketname.s3.amazonaws.com),您可能会认为这是正确的方法,但是在此用例中,使用静态网站托管终端节点(例如您需要使用bucketname.s3-website-us-east-1.amazonaws.com)。
凯伦2015年

7
同样重要的是,您的CloudFront发行版中没有设置任何默认根对象,因为它将破坏S3存储桶中的重定向。
米哈尔Czapliński

1
您的链接指向一个问题。您打算链接该问题的哪个答案?
2540625

@kellen,您如何将顶点转发到www?这就是我要为我的HTTPS域执行的操作。我的规范网址包括www。
哥斯达黎加

1
@Costa看看此答案中的说明。只需反转域,因为您想要顶点-> www。重要的是将静态网站托管部分下的存储桶中提供的URL用作CloudFront目标,而不是自动完成URL。stackoverflow.com/a/42869783/94671
kellen,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.