Cloudfront 缓存资源,尽管响应标头应该阻止它

Cloudfront 缓存资源,尽管响应标头应该阻止它

我最近设置了一个 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 标头。

相关内容