![Cloudfront 缓存资源,尽管响应标头应该阻止它](https://linux22.com/image/774121/Cloudfront%20%E7%BC%93%E5%AD%98%E8%B5%84%E6%BA%90%EF%BC%8C%E5%B0%BD%E7%AE%A1%E5%93%8D%E5%BA%94%E6%A0%87%E5%A4%B4%E5%BA%94%E8%AF%A5%E9%98%BB%E6%AD%A2%E5%AE%83.png)
我最近设置了一个 Cloudfront 发行版,其行为缓存策略如下:
- TTL 设置:
- 最小 TTL(秒):0
- 最大 TTL(秒):31536000
- 默认 TTL(秒):0
- 缓存键:
- 标题 - 无
- Cookies-无
- 查询字符串 - 全部
不幸的是,在并发度较低的情况下,无缓存响应标头的页面会继续缓存响应。我使用 apachebench 运行了 100 个请求,并发度为 5,并收到以下结果:
100 Cache-Control: no-cache, no-store, must-revalidate, max-age=0
25 X-Cache: Hit from cloudfront
75 X-Cache: Miss from cloudfront
我还捕获了本应唯一的响应标头,这些响应标头对于每个请求/响应来说都是唯一的(假设没有请求标头/cookie),这也表明存在重复的 Set-Cookie 响应。例如,此响应返回了 4 次:
4 Set-Cookie: csrftoken=h2uU7TKHJ6AicHgOIaJTwC5qIXJN4Zwf; Domain=.mysite.com; expires=Tue, 17-Jan-2023 15:10:37 GMT; Max-Age=31449600; Path=/
我相信我确实有解决这个问题的方法,比如使用更高优先级的 Cloudfront 行为来设置无缓存策略,但是它会剥夺服务器端决定是否应动态缓存响应的权力,并表明 Cloudfront 不遵守服务器端的决定。
答案1
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationDownloadDist定义当源以Cache-Control: no-cache, no-store, must-revalidate, max-age=0
最小 TTL 进行响应时,CloudFront 根本不会缓存响应。
冷 CDN 缓存有一个例外。据我了解,这种特殊情况的工作方式不同。当发生这种情况并且请求相同(例如,相同的查询字符串并且它们都没有设置 cookie)时,CloudFront CDN 可能会转发单个请求,然后使用该单个转发请求的响应来满足其余请求。
CloudFront 不遵守Vary:
此处的 HTTP 标头。