【发布时间】:2017-09-25 08:46:03
【问题描述】:
如果我理解正确,使用 ETags 的流程如下所述:
- 浏览器将请求发送到服务器。服务器发回带有 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 仍然使用磁盘缓存来加载数据。这是我现在的 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,只要设置了Expires 或max-age=>0,Chrome 就不会重新加载资源。
【问题讨论】:
标签: google-chrome http nginx server