您如何使 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 中的新文件)。
回答我自己的问题。我使用 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.html
和 robots.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。
所以我在 s3 上使用云端 dist 托管了我的 angular 应用程序。我使用 file revision-ing(使用 grunt filerev)来确保我永远不会得到陈旧的内容。但是,我应该如何对 index.html 文件进行版本控制。它是必需的,因为在 index.html.
中引用了所有其他文件我已将我的存储桶配置为用作静态站点。因此,当我在 url.
中引用存储桶时,它会选择 index.htmlCloudfront 说您应该将最小 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 中的新文件)。
回答我自己的问题。我使用 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.html
和 robots.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。