amazon-cloudfront - 在 CloudFront 中处理带有标头 Accept-Encoding 的请求与不带有标头 Accept-Encoding 的请求
问题描述
我有一个 Cloud Front Distribution 来缓存我的图像。我的原始服务器不是 S3,它是我运行的某个服务器。
我在我的网站中使用这些图像(利用 CF 缓存)。现在来解释这个问题,让我们假设在我的主页中我使用了一个名为banner.png
.
我访问我的主页让我们第一次从 chrome 说 - 因为 banner.png 它缓存未命中,所以它被从源获取并缓存在 CF 中。
在此之后,我从 FF、opera、Chromium 访问我的页面,使用 postman - 获取“banner.png” this all gets me the file from CF cache
。
现在我使用失眠(另一个休息客户端)获取“banner.png” - Now CF doesn't send me from cache, it goes back to origin to get the image, and reply me with **"x-cache: RefreshHit from cloudfront"**
。
这两组客户端之间的区别是第一组客户端在请求中发送“Accept-Encoding:gzip”标头,而第二组客户端没有。
在我的 CF 行为中 -
“基于选定请求标头的缓存”= NONE
对象自动" = NO"压缩
.
任何指针?
解决方案
CloudFront 根据接受编码保留两个不同的缓存副本。
一个如果 Header 包含 Accept-encoding: gzip
接受编码:任何其他值或没有标头。
您可以使用 curl 对其进行测试,首先不使用 accept-encoding,然后使用 accept-encoding: gzip 进行第二个请求,您将看到来自 CloudFront 的 MISS,这是 CloudFront 预期的。
原因是 CloudFront 仅支持 gzip 压缩,它会考虑此标头以了解是否需要压缩响应。
但是,您的问题似乎不同,您会看到来自 CloudFront 的引用,这发生在 CloudFront TTLs/Max-age 到期并且 CloudFront 正在向源发送条件 GET 以了解内容是否已被修改时。理想情况下,如果没有接受标头,它应该是来自 CloudFront 的 Miss。