Amazon CloudFront 不遵守我的 S3 网站存储桶的 index.html 规则

Posted

技术标签:

【中文标题】Amazon CloudFront 不遵守我的 S3 网站存储桶的 index.html 规则【英文标题】:Amazon CloudFront Doesn't Respect My S3 Website Bucket's index.html Rules 【发布时间】:2013-02-24 21:21:24 【问题描述】:

我正在使用静态网站托管选项在 Amazon S3 上托管一个静态网站,这样 S3 将呈现一个文件夹,而无需让我明确指向我的 index.html 文件。

例如,这里是指向我的 S3 存储桶中页面的直接链接:http://new.rdegges.com.s3-website-us-east-1.amazonaws.com/category/2009/ 如您所见,当您访问该 URL 时,Amazon S3 会自动呈现该目录内的 index.html 文件,让我可以有干净的网址。

这一切都在 S3 上运行良好。我遇到的问题是让 Amazon Cloudfront 也能正确处理这种行为。当我创建一个 Cloudfront Distribution 并将我的 S3 存储桶指定为源并告诉它使用“index.html”作为根时,S3 的 index.html 行为刚刚停止工作。

例如,这是我在 Cloudfront 上的相同 URL:http://d1mj00c6pby3gc.cloudfront.net/category/2009/

不幸的是,上面的 URL 不起作用,但如果我手动指定索引文件,它会起作用,例如:http://d1mj00c6pby3gc.cloudfront.net/category/2009/index.html

我的问题是:我需要如何配置 Cloudfront 以使其尊重我网站的 S3 存储桶设置?

【问题讨论】:

你绝对可以设置为root。不过,不确定它是否适用于每个目录。 aws.typepad.com/aws/2010/08/… 嘿@dirn,是的!我正在使用 index.html 的默认根目录,但由于某种原因,它不适用于任何子文件夹(仅限***)。我觉得这很奇怪,因为 S3 具有相同的设置,并且它也适用于所有子文件夹,arg。 “不尊重”..哇!向我 +1 ???? 相关***.com/q/13280836/356887 【参考方案1】:

S3 网站功能可与 Amazon CloudFront 结合使用。但是,S3 网站使用与常规 S3 存储桶不同的域名。在这种情况下,您需要将 CloudFront 分配的原始配置的 Origin Domain Name 设置为 new.rdegges.com.s3-website-us-east-1.amazonaws.com

您可以从 S3 上的静态网站托管面板获取此 URL(端点):

一旦 CloudFront 指向 S3 网站域名,S3 网站功能应该可以工作。

【讨论】:

很好的解决方案,谢谢。我敢打赌,很多人都会遇到这种情况,因为云端会自动完成存储桶名称,而不是静态网站 url。一开始我并不清楚区别。 唯一的缺点是,如果您使用静态网站端点,则无法在 CloudFront 和 S3 之间使用 SSL。所以,SSL 或 index.html 处理:选择一个。 @AlexB 在添加 Origin 以使用“仅 HTTP”或“匹配查看器”时(现在)有一个选项。 “如果您为源协议策略选择匹配查看器,并且查看器使用 HTTPS 连接到 CloudFront,CloudFront 将使用 HTTPS 连接到您的源。” +2 - 刚回来给你一个赞成票,因为这解决了我的问题 - 我已经给了你一个赞成票 - 上次发生在我身上。棘手的是 AWS 将 CloudFront 源自动完成到您的 S3 存储桶,但默认不是网站 URL,而是 S3 URL。您会认为 AWS 会知道 S3 存储桶已配置为网站,并相应地调整默认值。 @AlexB 仍然是这种情况 - 如果您的源域名是您的 S3 静态网站端点,您不能使用 Cloudfront SSL?【参考方案2】:

我想在接受的答案中添加一些内容。

首先,确保您的云端有Default Root Object。如documentation 中所述,这不适用于subdirectories

在设置新的 cloudfront 分发时,它会让您选择您的存储桶bucket-name.s3.amazonaws.com。请注意,该区域未在 URL 中指定。您需要做的是从 s3 中获取静态站点 url 并将其用作origin url(该区域将在那里)。

【讨论】:

我遇到了根对象没有给出默认 index.html 的问题。起初我尝试将它发送到 cname www.example.com 和 www.example.com/index.html 这不起作用,当我简单地将根对象设置为 index.html 我必须将 CF 默认根对象设置为空白(未设置),然后将 s3 存储桶上的索引文档设置为 index.html【参考方案3】:

这可能是游戏的后期,但请查看Lambda@Edge。您可以在没有扩展名的情况下拦截 Origin Requests 并将它们指向文件夹中的 index.html 文档。这些结果会被缓存,因此 Lambda 仅在收到新请求时才会执行。

【讨论】:

以上是关于Amazon CloudFront 不遵守我的 S3 网站存储桶的 index.html 规则的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要 Amazon S3 和 Cloudfront?

带有 Route 53 的 Amazon CloudFront

通过 S3 从 Amazon CloudFront 提供 gzip 后的 CSS 和 JavaScript

Amazon Cloudfront 可以流式传输到 iOS 设备吗

Amazon CloudFront CNAME [关闭]

Amazon S3 和 Cloudfront 上的 Node.js 服务器