Caching Amazon Cloudfront缓存控制:无缓存头在24小时后无效

Caching Amazon Cloudfront缓存控制:无缓存头在24小时后无效,caching,amazon-web-services,amazon-s3,amazon-cloudfront,Caching,Amazon Web Services,Amazon S3,Amazon Cloudfront,我在S3中托管一个静态网站,并使用Cloudfront缓存文件。我基本上有3个文件,标题如下: index.html(缓存控制:无缓存) app.js(缓存控制:最大年龄=63072000,公共) style.css(缓存控制:max age=63072000,公共) 我的html文件使用查询字符串参数,这些参数在每次更新css或js文件时都会更新。我已经将s3配置为传递这些参数,并且我已经验证了它可以使缓存的资源无效。我的index.html文件如下所示: <html>

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

  • index.html(缓存控制:无缓存)
  • app.js(缓存控制:最大年龄=63072000,公共)
  • style.css(缓存控制:max age=63072000,公共)
我的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>

...
...
当我整天推送更新时,它似乎工作得很好,但是当我第二天早上来推送我的下一个更改时,index.html文件已经过时了。它没有使用正确的?v=参数,而是使用了旧参数!修复它的唯一方法是手动使html文件无效。然后一天剩下的时间里一切都正常。第二天我又遇到了同样的问题


这里发生了什么?

请验证CloudFront发行版的
最小TTL
是否设置为0。如果将其设置为任何其他值,CloudFront将不考虑
无缓存
头,并且仍将缓存文件以获得
最小TTL
。有关缓存指令的更多详细信息,请参见此处:

如果这没有帮助,请尝试调试
index.html
的实际HTTP请求,并在此处发布响应头,以便我们可以查看它们

另外,您可以尝试使用

public,必须重新验证,代理重新验证,最大年龄=0


这将允许CloudFront将文件存储在边缘位置,但它将强制它在每次请求时使用源文件重新验证文件。如果文件没有更改,CloudFront将不需要从源位置传输文件的全部内容。这可以加快响应时间,尤其是对于较大的文件

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

通过查询参数破坏缓存有缺点,尽管您可以通过Cloudfront行为来解决这些缺点。看见尽管如此,我还是建议使用唯一的文件名,例如
app.css?v=14113e2c764
变成
app.14113e2c764.css

回应BradLaney的评论/问题:如果您更新了缓存控制头,但没有看到更改,那是因为原始项已被缓存了–将其作废,您应该在下次查看资源时看到新的头

关于为S3项目设置缓存控制时的竞争条件,或者只是为SPA设置缓存控制,这对我的团队来说是非常有效的:

# Sync all files with 1 week cache-control, excluding .html files.
aws s3 sync --cache-control 'max-age=604800' --exclude *.html dist/ s3://$AWS_BUCKET/
# Sync remaining .html files with no cache.
aws s3 sync --cache-control 'no-cache' dist/ s3://$AWS_BUCKET/

看起来这是上传到s3的构建脚本中的竞争条件。我发送的标题不一致。将这些元标记添加到index.html文件后,是否需要将最小TTL设置为0?对于其他文件,我们可以使用min TTL>0而不是index.html吗?如果您在CloudFront中定义了多个行为(例如,一个用于index.html,另一个用于其余文件),则可以使用不同的
Minimum TTL
值。请记住,CloudFront中配置的
最小TTL
通常不是控制资源缓存时间的最佳解决方案。通常,您应该在源服务器生成的响应上指定
缓存控制
头来控制这些响应,并将CloudFront的最小TTL值保持在0.24小时是CloudFront的默认行为,并且不能以任何方式被覆盖。好消息是,如果对象在原点没有更改,它将不会重新蚀刻对象,它将使用缓存中的内容,并重新启动24小时时钟。自定义选项中的最大TTL=0似乎是可能的,并且可以从24小时更改时间。