首页 > 解决方案 > 在 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"压缩

.

任何指针?

标签: amazon-cloudfront

解决方案


CloudFront 根据接受编码保留两个不同的缓存副本。

  1. 一个如果 Header 包含 Accept-encoding: gzip

  2. 接受编码:任何其他值或没有标头。

您可以使用 curl 对其进行测试,首先不使用 accept-encoding,然后使用 accept-encoding: gzip 进行第二个请求,您将看到来自 CloudFront 的 MISS,这是 CloudFront 预期的。

原因是 CloudFront 仅支持 gzip 压缩,它会考虑此标头以了解是否需要压缩响应。

但是,您的问题似乎不同,您会看到来自 CloudFront 的引用,这发生在 CloudFront TTLs/Max-age 到期并且 CloudFront 正在向源发送条件 GET 以了解内容是否已被修改时。理想情况下,如果没有接受标头,它应该是来自 CloudFront 的 Miss。


推荐阅读