为什么浏览器不遵守 Cache-Control header?

Why isn't the browser respecting the Cache-Control header?

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

后续请求后可以看到浏览器returns304(未修改)

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

这是 chrome 网络流量:

请求:

  1. 200(还行)
  2. 304(未修改)

~图片在幕后改变了~

  1. 200(还行)
  2. 304(未修改)

这是回复header:

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

有两件事让我感到困惑:

  1. 响应应该还是304(未修改)?浏览器如何知道去获取图像? max-age 还没到?
  2. chrome 不应该显示 "from disk cache" 或其他什么吗? (实际上并不是 go 到服务器?)

我的猜测是 - 我没有设置正确的 cache-control header 之类的。那么有人可以阐明这种行为,让我知道我需要做什么才能将资源缓存 1 小时 :)

谢谢!

响应中指定了ETag

ETag 在规范中这样解释

An entity-tag can be more reliable for validation than a modification date in situations where it is inconvenient to store modification
dates, where the one-second resolution of HTTP date values is not
sufficient, or where modification dates are not consistently
maintained.

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

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

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

参考文献: