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

不应该缓存它,因为:
cache-control: max-age=0, no-store;/*上),所以这个缓存的资源不是来自某个历史部署

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

发布于 2021-10-05 18:00:41
经过广泛的讨论和支持,他们解释了发生了什么。
因此,如果您的no-store和最小TTL为0,那么CloudFront实际上不会存储您的资源。但是,如果您的原产地需要很长时间来响应(在负载很重的情况下),当CloudFront等待对请求的响应时,如果它得到另一个相同的请求(与缓存密钥相同),那么它将向两个请求发送一个响应。这是为了减轻服务器上的负载。(见文档)
虽然我没有在文档中看到这一点,但支持称这些是“崩溃”。
因此,在为缓存的其他页面提供服务时,您似乎不能有一个单独的行为来服务某些页面,这些页面在每个请求中都必须有一个唯一的响应。支持说:
我刚刚证实,使用最小TTL 0和缓存控制:无存储,我们不能禁用崩溃命中.如果确实需要完全禁用cloudfront缓存,则可以使用缓存策略CachingDisabled
我们将为每个需要缓存的路径前缀创建一个行为。对于我们的用例来说,似乎没有比这更好的方法了(将我们的网站从不可缓存的后端呈现的jinja2 2/jQuery转换为可缓存的、客户端呈现的React/Next.js)。
发布于 2022-03-01 02:56:47
对于OP的项目来说可能为时已晚,但我会用一个简单的原始响应Lambda@Edge函数以及/*和缓存策略的单个缓存行为来处理这个问题。您可以在源文件响应函数中编写所有的过滤/缓存逻辑。这样,您就只能在一个地方管理一小部分函数代码,而不是一堆单独的缓存行为(可能还有一堆缓存策略)。
例如,一个源文件响应函数,它查找来自您的源文件的缓存控制响应头。如果存在,请将其传回客户端。但是,如果它不存在(或者您想用其他东西覆盖它),那么您可以在那里创建响应头。边缘并不关心缓存控制头是来自您的源,还是来自原始响应Lambda。到了边缘,一切都一样。
发布于 2022-11-24 15:17:24
为了避免缓存并仍然使用默认的行为,您可以使用另一个技巧:为每个请求设置一个虚拟的未使用的查询参数,该参数等于一个唯一的值。
Python示例:
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()总是生成唯一的值。
这是因为默认情况下(如果在“行为”部分中没有定义),查询参数是缓存键的一部分。
注意:这样做将避免使用缓存,因此后端可能会装载请求。
https://stackoverflow.com/questions/69421737
复制相似问题