RefreshHit from cloudfront even with cache-control: max-age=0, no-store

Gar*_*ett 4 caching cache-control amazon-cloudfront

Cloudfront is getting a RefreshHit for a request that is not supposed to be cached at all.

在此输入图像描述

它不应该被缓存,因为:

  1. 它有cache-control: max-age=0, no-store
  2. 最小 TTL 为 0;和
  3. 我已经创建了多个失效(on /*),因此这个缓存的资源不是来自某些历史部署

在此输入图像描述

知道为什么我会收到 RefreshHits 吗?

我还尝试将 Cache-Control 修改为cache-control no-store, stale-if-error=0,创建一个新的失效/*,现在我看到缓存命中(这次是在 Firefox 中):

在此输入图像描述

Gar*_*ett 7

在与支持人员进行广泛交谈后,他们解释了发生的事情。

因此,如果您的no-store最小 TTL 为 0,那么 CloudFront 确实不会存储您的资源。但是,如果您的 Origin 需要很长时间才能响应(很可能在重负载下),而 CloudFront 等待对请求的响应,如果它收到另一个相同的请求(与缓存键相同),那么它会发送对两个请求的同一个响应。这样做是为了减轻服务器的负载。(参见文档

支持人员称这些为“崩溃点击”,尽管我在文档中没有看到这一点。

因此,似乎您不能让单个行为为某些页面提供服务,而这些页面在为缓存的其他页面提供服务时,每个请求必须具有唯一的响应。支持说:

我刚刚确认,使用 min TTL 0 和缓存控制:无存储,我们无法禁用崩溃命中。如果您确实需要完全禁用cloudfront缓存,可以使用缓存策略CachingDisabled

我们将为需要缓存的每个路径前缀制定一个行为。对于我们的用例来说,似乎没有比这更好的方法了(将我们的网站从不可缓存、后端渲染的 jinja2/jQuery 一次一页地转换为可缓存、客户端渲染的 React/Next.js)。