【问题标题】:Why isn't the browser respecting the Cache-Control header?为什么浏览器不尊重 Cache-Control 标头?
【发布时间】:2018-07-10 03:44:57
【问题描述】:

我在 S3 上有一个图像,它的 Cache-Control 标头设置为 public, max-age=3600。因此,下游系统(代理、浏览器等)应将其缓存 1 小时。

我可以看到浏览器在后续请求后返回 304(未修改)。

然后我去了并更新了 S3 上的图像(资源没有版本控制..URL 没有改变,只是 _content),但是浏览器去了并得到了 新版本。 (例如 HTTP 200)。

这是 chrome 网络流量:

请求:

  1. 200(正常)
  2. 304(未修改)

~幕后的图片变了~

  1. 200(正常)
  2. 304(未修改)

这是响应标头:

这怎么可能?我没有设置正确的标题吗?

有两件事让我感到困惑:

  1. 响应仍应为 304(未修改)?浏览器是如何知道去获取图像的? max-age 还没联系到?
  2. chrome 不应该显示“来自磁盘缓存”还是什么? (实际上并没有到服务器?)

我的猜测是 - 我没有设置正确的缓存控制标头或其他东西。所以有人可以解释一下这种行为,让我知道我需要做些什么来缓存资源 1 小时 :)

谢谢!

【问题讨论】:

标签: http caching browser-cache cache-control


【解决方案1】:

在响应中指定了ETag

ETag 在规范中是这样解释的

实体标签的验证比修改更可靠 不方便存储修改的情况下的日期
日期,其中 HTTP 日期值的一秒分辨率不是
足够,或者修改日期不一致
维护。

所以浏览器更喜欢它而不是基于日期的过期。

因此,您的浏览器每次都会发出请求,除非内容已更改 - 返回 http 304。否则 - 它是 http 200。

如果您只想要基于时间的过期 - 删除 ETag

参考资料:

【讨论】:

  • 啊.. 我怀疑它是 etag。所以优先吗?例如,如果改变了,它会去获取图像,尽管最大年龄?基本上,如果你有一个 ETag,那么设置 max-age 也没有意义?
  • @RPM1984 它每次都会发出请求,不管max-age
  • "如果你有 ETag,甚至设置 max-age 都没有意义" --- 是的,我会这么说
  • 但是为什么我的浏览器仍然访问服务器,即使是 304?它不应该说(来自磁盘缓存)吗? (例如我的问题中的第 2 点)。它不会进入服务器的条件是什么?
  • @RPM1984 ETag 的存在使其每次都运行。 “不应该说(来自磁盘缓存)吗?” --- 它不应该,因为响应是从具有 HTTP 304 的服务器提供的,只有内容来自磁盘缓存。 http 304 表示内容来自缓存。
猜你喜欢
  • 1970-01-01
  • 2016-08-14
  • 2010-11-05
  • 1970-01-01
  • 2021-09-13
  • 2014-02-13
  • 2019-12-03
  • 2017-07-27
  • 2011-08-13
相关资源
最近更新 更多