您如何使 index.html 的缓存失效以使用云端在 S3 上托管的静态站点?

How do you invalidate cache of index.html for a static site hosted on S3 with cloudfront?

所以我在 s3 上使用云端 dist 托管了我的 angular 应用程序。我使用 file revision-ing(使用 grunt filerev)来确保我永远不会得到陈旧的内容。但是,我应该如何对 index.html 文件进行版本控制。它是必需的,因为在 index.html.

中引用了所有其他文件

我已将我的存储桶配置为用作静态站点。因此,当我在 url.

中引用存储桶时,它会选择 index.html

Cloudfront 说您应该将最小 TTL 设置为 0,这样它就会始终命中源以提供内容。但是,我不需要这个,因为我正在对所有文件进行文件修订(index.html 除外)。我可以利用这些文件的 cdn 缓存。

他们还说为了使单个 object 无效,请将 max-age headers 设置为 0。我尝试将以下内容添加到我的 index.html

<meta http-equiv="Cache-Control" content="public, must-revalidate, proxy-revalidate, max-age=0"/>

但是一旦你在 s3 上上传,这就不会反映出来。我是否需要使用 s3cmd 或仪表板在 s3 上显式设置 headers?每次 index.html 更改并上传时我都需要这样做吗?

我知道我可以使用 cmd 使单个文件无效,但它是一个重复的过程,如果它可以通过部署在 s3 上来处理自己,那就太好了。

您可以使用 Lambda 自动执行流程。它允许您创建一个函数,该函数将执行某些操作(在您的情况下为对象失效)以响应某些事件(S3 中的新文件)。

更多信息在这里: https://aws.amazon.com/documentation/lambda/

回答我自己的问题。我使用 s3cmd tool 将我的站点部署到 S3,您可以提供一个选项来使所有已更改文件的 CloudFront 缓存无效(dist 文件夹和 S3 存储桶之间的差异)。这会使所有已更改文件(包括索引文件)的缓存失效。通常需要大约 15-20 分钟才能反映生产的新变化。

这是命令

s3cmd sync --acl-public --reduced-redundancy --delete-removed --cf-invalidate [your-distribution-folder]/* s3://[your-s3-bucket]

注意:在 macOS 上,您可以通过以下方式安装此工具:brew install s3cmd.

希望这对您有所帮助。

尽管如果您使用的是 s3cmd,则接受的答案是正确的,但我使用的是 AWS CLI,所以我所做的是以下 2 个命令:

首先,实际部署代码:

aws s3 sync ./ s3://bucket-name-here/ --delete

然后,在 CloudFront 上创建失效:

aws cloudfront create-invalidation --distribution-id <distribution-id> --paths /index.html

如果您使用 s3cmd sync 并使用 --cf-invalidate 选项,您可能还必须根据您的设置指定 --cf-invalidate-default-index

来自手册页:

When using Custom Origin and S3 static website, invalidate the default index file.

这将确保也使您的索引文档失效,很可能 index.html,否则无论是否通过同步更新都将被跳过。

当您将本地目录与 s3 同步时,您可以这样做:

aws s3 sync ./dist/ s3://your-bucket --delete

aws s3 cp \
   s3://your-bucket s3://your-bucket \
   --exclude 'index.html' --exclude 'robots.txt' \ 
   --cache-control 'max-age=604800' \
   --metadata-directive REPLACE --acl public-read \
   --recursive

第一个命令只是正常同步,第二个命令启用 S3 以 return 对所有文件进行缓存控制,index.htmlrobots.txt 除外。

那么你的SPA就可以完全缓存了(除了index.html)。

我在 S3 上托管并使用 CloudFront 分发的静态网站也遇到了同样的问题。在我的例子中,使 /index.html 无效是行不通的。

我与 AWS 支持人员进行了交谈,我需要做的是仅使 / 无效。这是因为我正在使用 https://website.com/ URL and not with https://website.com/index.html 访问我的网站(这会带来带有 /index.html 失效的更新内容)。这是在 AWS CloudFront 控制台中完成的,而不是使用 AWS CLI。