首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自cloudfront的RefreshHit,即使有缓存控制:最大值=0,无存储

来自cloudfront的RefreshHit,即使有缓存控制:最大值=0,无存储
EN

Stack Overflow用户
提问于 2021-10-03 02:57:57
回答 3查看 1.5K关注 0票数 4

Cloudfront正在为一个不应该缓存的请求获取一个RefreshHit。

不应该缓存它,因为:

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

知道我为什么要得到RefreshHits吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-05 18:00:41

经过广泛的讨论和支持,他们解释了发生了什么。

因此,如果您的no-store和最小TTL为0,那么CloudFront实际上不会存储您的资源。但是,如果您的原产地需要很长时间来响应(在负载很重的情况下),当CloudFront等待对请求的响应时,如果它得到另一个相同的请求(与缓存密钥相同),那么它将向两个请求发送一个响应。这是为了减轻服务器上的负载。(见文档)

虽然我没有在文档中看到这一点,但支持称这些是“崩溃”。

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

我刚刚证实,使用最小TTL 0和缓存控制:无存储,我们不能禁用崩溃命中.如果确实需要完全禁用cloudfront缓存,则可以使用缓存策略CachingDisabled

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

票数 7
EN

Stack Overflow用户

发布于 2022-03-01 02:56:47

对于OP的项目来说可能为时已晚,但我会用一个简单的原始响应Lambda@Edge函数以及/*和缓存策略的单个缓存行为来处理这个问题。您可以在源文件响应函数中编写所有的过滤/缓存逻辑。这样,您就只能在一个地方管理一小部分函数代码,而不是一堆单独的缓存行为(可能还有一堆缓存策略)。

例如,一个源文件响应函数,它查找来自您的源文件的缓存控制响应头。如果存在,请将其传回客户端。但是,如果它不存在(或者您想用其他东西覆盖它),那么您可以在那里创建响应头。边缘并不关心缓存控制头是来自您的源,还是来自原始响应Lambda。到了边缘,一切都一样。

票数 0
EN

Stack Overflow用户

发布于 2022-11-24 15:17:24

为了避免缓存并仍然使用默认的行为,您可以使用另一个技巧:为每个请求设置一个虚拟的未使用的查询参数,该参数等于一个唯一的值。

Python示例:

代码语言:javascript
复制
import requests
import uuid
requests.get(f'http://my-test-server-x.com/my/path?nochace={uuid.uuid4()}')
requests.get(f'http://my-test-server-x.com/my/path?nochace={uuid.uuid4()}')

请注意,这两个调用都将到达目的地,并且不会从缓存获得响应,因为uuid.uuid4()总是生成唯一的值。

这是因为默认情况下(如果在“行为”部分中没有定义),查询参数是缓存键的一部分。

注意:这样做将避免使用缓存,因此后端可能会装载请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69421737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档