对于使用cloudfront在S3上托管的静态站点,如何使index.html的缓存无效?

Nir*_*dhi 15 html cdn amazon-s3 amazon-web-services amazon-cloudfront

所以我在s3上使用cloudfront dist托管了我的角度应用程序.我做文件修改(使用grunt filerev)以确保我永远不会得到陈旧的内容.但是,我应该如何对index.html文件进行版本控制.它是必需的,因为所有其他文件都在index.html中引用.

我已将我的存储桶配置为静态站点.因此,当我在url中引用存储桶时,它只会获取index.html.

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

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

<meta http-equiv="Cache-Control" content="public, must-revalidate, proxy-revalidate, max-age=0"/>
Run Code Online (Sandbox Code Playgroud)

但是,一旦您在s3上传,这就不会反映出来.我是否需要使用s3cmd或仪表板在s3上显式设置标头?每当index.html更改并上传它时,我是否需要这样做?

我知道我可以使用cmd使单个文件无效,但它是一个重复的过程,如果它只是通过在s3上部署就可以解决它本身.

Jor*_*dan 20

虽然如果你使用的是s3cmd,但是接受的答案是正确的,我使用的是AWS CLI,所以我做的是以下两个命令:

首先,要实际部署代码:

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

然后,在CloudFront上创建失效:

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


小智 9

我在 S3 上托管并通过 CloudFront 分发的静态网站也遇到了同样的问题。就我而言,无效/index.html不起作用。

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


Nir*_*dhi 6

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

这是命令

s3cmd sync --acl-public --reduced-redundancy --delete-removed --cf-invalidate [your-distribution-folder]/* s3://[your-s3-bucket]
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.