no-store
和最小TTL为0,则CloudFront确实不会存储您的资源。但是,如果您的源需要很长时间才能响应请求(因此很可能是重载),而CloudFront在等待响应的同时收到另一个相同的请求(相对于缓存键是相同的),那么它将发送一个响应给两个请求。这是为了减轻服务器的负荷。(请参见 文档)max-age=0,must-revalidate,public
,并确保您还可以发送回ETag。 - Cory Silva另一个技巧,可以避免缓存并仍然使用默认的CloudFront行为,是:有一个虚拟未使用的查询参数,其值等于每个请求的唯一值。
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()}')
对于 OP 的项目来说,可能已经太晚了,但我个人会使用一个简单的起点-响应 Lambda@Edge 函数和一个单一的缓存行为(/* 和缓存策略)来处理这个问题。您可以在起点-响应函数中编写所有的过滤/缓存逻辑。这样,您只需要在一个地方管理一个函数代码位,而不是一堆单独的缓存行为(以及可能是一堆缓存策略)。
例如,一个起点-响应函数,它查找来自您起点的缓存控制响应头。如果存在,则将其传回客户端。但是,如果不存在(或者您想用其他内容覆盖它),那么您可以在此处创建响应头。边缘不关心缓存控制头是来自您的起点还是来自起点-响应 Lambda。对于边缘来说,它都是一样的。