Ada*_*dam 27 caching amazon-s3 amazon-web-services amazon-cloudfront
我在S3中托管一个静态网站,并使用Cloudfront缓存文件.我基本上有3个文件,包含以下标题:
我的html文件使用查询字符串参数,每次更新我的css或js文件时都会更新.我已经配置了s3来传递这些参数,并且我已经验证它可以使缓存的资源无效.我的index.html文件看起来像这样:
<html>
<head>
...
<link rel="stylesheet" href="app.css?v=14113e2c764">
</head>
<body>
...
<script src="app.js?v=14113e2c764"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
它似乎工作得很好,因为我整天推送更新,但是当我第二天早上来并推动我的下一个更改时,index.html文件已过期.它没有正确的?v =参数,而是旧的!解决它的唯一方法是手动使html文件无效.然后一切都适用于其余的一天.第二天我又遇到了同样的问题.
这里发生了什么?
dcr*_*cro 42
验证CloudFront分配Minimum TTL是否设置为0.如果将其设置为任何其他值,CloudFront将不会尊重no-cache标头并仍将缓存该文件Minimum TTL.有关缓存指令的更多详细信息,请访问:
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
如果这没有用,请尝试调试实际的HTTP请求index.html并在此处发布响应头,以便我们查看它们.
此外,no-cache您可以尝试使用而不是用于index.html文件
public, must-revalidate, proxy-revalidate, max-age=0
这将允许CloudFront将文件存储在边缘位置,但它将强制它使用每个请求的原点重新验证它.如果文件未更改,CloudFront将不需要从源文件传输文件的整个内容.这可以加快响应时间,尤其是对于较大的文件.
这更像是一条评论,但有点太长了。希望能帮助其他登陆这里的人。
\n通过查询参数进行缓存清除有缺点,尽管也许您可以通过 Cloudfront 行为来克服所有这些缺点。请参阅/sf/answers/1691627451/。尽管如此,我还是会推荐独特的文件名,例如app.css?v=14113e2c764变成app.14113e2c764.css.
回应 BradLaney 的评论/问题:如果您更新了缓存控制标头但没有看到更改,那是因为原始项目已被缓存\xe2\x80\x93 使其无效,并且您下次查看资源时应该会看到新的标题。
\n关于为 S3 项目设置缓存控制时的竞争条件,或者只是为 SPA 设置一般缓存控制,这对我的团队来说效果很好:
\n# Sync all files with 1 week cache-control, excluding .html files.\naws s3 sync --cache-control \'max-age=604800\' --exclude *.html dist/ s3://$AWS_BUCKET/\n# Sync remaining .html files with no cache.\naws s3 sync --cache-control \'no-cache\' dist/ s3://$AWS_BUCKET/\nRun Code Online (Sandbox Code Playgroud)\n