Chrome忽略ETag头,只使用内存缓存/磁盘缓存 [英] Chrome ignores the ETag header and just uses the in memory cache/disk cache

查看:29
本文介绍了Chrome忽略ETag头,只使用内存缓存/磁盘缓存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我理解正确,eTag的使用流程如下所述:

  • 浏览器将请求发送到服务器。服务器发回带有ETag的图像
  • 浏览器将资源与ETag一起保存
  • 对于下一个请求,浏览器将发送包含保存的ETag的标头If-None-Match的请求。

返回响应时,Chrome开发工具告诉我这些是我的标题

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

现在,当我重新加载页面时,不会收集新图像。它是通过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
Chrome仍然使用磁盘缓存来LAOD数据。这是我现在的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";
}

更新3
我刚刚做了一些进一步的研究。一旦设置了Expires标签,Chrome就会使用内存或磁盘缓存。与max-age相同。我不明白,即使设置了must-revalidate,一旦设置了Expiresmax-age=>0,Chrome也不会重新加载资源。

推荐答案

服务器告诉Chrome资源在接下来的2小时(7200秒)内是好的。您的第二个请求可能早于此。

您最好使用max-age: 0max-age: 0, must-revalidate。然后,尽管您永远不会得到完全缓存的操作(甚至不会费心击中服务器),但是您仍然可以让服务器发送304 Not Modified响应,告诉浏览器它可以使用缓存的实体(如果适用,还可以更新任何基于标头的元数据),因此,当您仍然有一个请求-响应发生时,将只发送大约300字节,而不是实体有多少千字节或更多。

(##**$$}{##**$$}}

这篇关于Chrome忽略ETag头,只使用内存缓存/磁盘缓存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆