Chrome会忽略ETag标头,只使用内存缓存/磁盘缓存

Mus*_*abe 10 google-chrome http nginx server

如果我理解正确,使用ETags的流程就像现在描述的那样:

  • 浏览器将请求发送到服务器.服务器使用ETag发回图像
  • 浏览器将资源与ETag一起保存
  • 在下一个请求中,浏览器使用If-None-Match包含已保存ETag 的标头发送请求.

返回响应时,chrome dev工具告诉我这些是我的标题

Cache-Control:max-age=7200
Connection:keep-alive
Content-Type:image/png
Date:Thu, 27 Apr 2017 13:42:57 GMT
ETag:"b36f59c868d4678033d318a182658e18371df8f5"
Expires:Thu, 27 Apr 2017 15:42:57 GMT
Server:nginx
Transfer-Encoding:chunked
X-Debug-Token:873c8f
X-Debug-Token-Link:http://localhost:8081/_profiler/873c8f
Run Code Online (Sandbox Code Playgroud)

现在,当我重新加载页面时,不会收集新图像.它可以通过Chrome的内存缓存或磁盘缓存保存,如您所见

Chrome开发标签

但为什么会这样呢?我发送了一个ETag,为什么浏览器不向服务器发出另一个请求,而是使用它自己的缓存?

我问的原因是,我们想要缓存我们的图像,但是一旦它们发生变化,它们应该立即更新.为什么Chrome会这样做?

更新
我刚注意到它在Firefox上很有用,所以这似乎是一个chrome"功能"而不是配置.

更新2
为此图像设置我的新标题后

Cache-Control:max-age=0, private
Connection:keep-alive
Content-Type:image/png
Date:Thu, 27 Apr 2017 14:44:57 GMT
ETag:"e5b18bdebe44ed4bba3acb6584d9e6a81692ee27"
Expires:Fri, 27 Oct 2017 14:44:57 GMT
Server:nginx
Transfer-Encoding:chunked
X-Debug-Token:3447a6
X-Debug-Token-Link:http://localhost:8081/_profiler/3447a6
Run Code Online (Sandbox Code Playgroud)

Chrome仍然使用磁盘缓存来处理数据.这是我的nginx吧

location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  access_log off;
  add_header Cache-Control "max-age: 0, must-revalidate";
}
Run Code Online (Sandbox Code Playgroud)

更新3
我刚做了一些进一步的研究.设置Expires标记后,Chrome会立即使用内存或磁盘缓存.与...相同max-age.我不明白,即使must-revalidate设置,只要Expiresmax-age=>0设置,Chrome不重新加载的ressource.

Joh*_* T. 6

对于可能登陆此处的其他人,请注意,如果存在任何SSL 错误(例如,如果您使用自签名证书),Chrome 不会缓存任何内容。

引导我的原始帖子:https ://stackoverflow.com/a/55101722/9536265

Chrome bug:https://bugs.chromium.org/p/chromium/issues/detail ?id=110649(看起来他们永远不会修复它,这似乎很荒谬,因为几乎所有开发人员都会在这种情况下进行开发)

我无法通过文档确认,但该行为似乎与 Edge Chromium 相同。另一方面,Firefox 将很乐意遵循使用“不安全”证书的站点的标准缓存实践,例如那些具有不完全匹配的站点名称或自签名证书的站点。我没有测试过 Safari。


Jon*_*nna 5

服务器告诉chrome未来2个小时(7200秒)的资源状况良好。大概您的第二个请求早于此。

max-age: 0也许最好为您服务max-age: 0, must-revalidate。然后,尽管您永远不会获得完全缓存的操作(甚至不用费心去打服务器),但仍然可以让服务器发送304 Not Modified响应,以告知浏览器它可以使用缓存的实体(并在适用时根据标头更新任何元数据) ),因此当您仍然有请求-响应时,只会发送大约300bytes,而不是实体发送的KB或更多。

  • @Musterknabe 我遇到了同样的问题,Chrome 没有在 Firefox 发送 If-None-Match 。你能弄清楚原因吗? (3认同)