Amazon Cloudfront Cache-Control:24小时后no-cache标头无效

Ada*_*dam 27 caching amazon-s3 amazon-web-services amazon-cloudfront

我在S3中托管一个静态网站,并使用Cloudfront缓存文件.我基本上有3个文件,包含以下标题:

  • index.html(Cache-Control:no-cache)
  • app.js(Cache-Control:max-age = 63072000,public)
  • style.css(Cache-Control:max-age = 63072000,public)

我的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将不需要从源文件传输文件的整个内容.这可以加快响应时间,尤其是对于较大的文件.


Cha*_*ser 7

这更像是一条评论,但有点太长了。希望能帮助其他登陆这里的人。

\n

通过查询参数进行缓存清除有缺点,尽管也许您可以通过 Cloudfront 行为来克服所有这些缺点。请参阅/sf/answers/1691627451/。尽管如此,我还是会推荐独特的文件名,例如app.css?v=14113e2c764变成app.14113e2c764.css.

\n

回应 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/\n
Run Code Online (Sandbox Code Playgroud)\n