ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

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

您绝对可以将其设置为根。不过,不确定它是否适用于每个目录。 aws.typepad.com/aws/2010/08/…
嘿@dirn,是的!我正在使用 index.html 的默认根目录,但由于某种原因,它不适用于任何子文件夹(仅限顶级)。我觉得这很奇怪,因为 S3 具有相同的设置,并且它也适用于所有子文件夹,arg。
“不尊重”..哇! +1 来自我😃

f
fregante

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

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

https://i.stack.imgur.com/AUTew.png

一旦 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?
M
Michael Yagudaev

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

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

在设置新的云端分发时,它会让您选择您的存储桶 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
D
Dries Van Hansewijck

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