为什么浏览器不遵守 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 网络流量:
请求:
- 200(还行)
- 304(未修改)
~图片在幕后改变了~
- 200(还行)
- 304(未修改)
这是回复header:
这怎么可能?我没有设置正确的 header 吗?
有两件事让我感到困惑:
- 响应应该还是304(未修改)?浏览器如何知道去获取图像?
max-age
还没到?
- 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
.
参考文献:
我在 S3 上有一张图像,Cache-Control
header 设置为 public, max-age=3600
。因此,下游系统(代理、浏览器等)应将其缓存 1 小时。
后续请求后可以看到浏览器returns304(未修改)
然后我去了 更新了 S3 上的图像(资源没有版本化..URL 没有改变,只是_content) , 但浏览器获取了 new 版本。 (例如 HTTP 200)。
这是 chrome 网络流量:
请求:
- 200(还行)
- 304(未修改)
~图片在幕后改变了~
- 200(还行)
- 304(未修改)
这是回复header:
这怎么可能?我没有设置正确的 header 吗?
有两件事让我感到困惑:
- 响应应该还是304(未修改)?浏览器如何知道去获取图像?
max-age
还没到? - 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
.
参考文献: