如果我理解正确,使用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
我刚刚进行了进一步的研究。只要设置了过期标签,Chrome就会使用内存或磁盘缓存。同样适用于max-age
。我不明白的是,即使设置了must-revalidate
,只要设置了Expires
或max-age=>0
,Chrome也不重新加载资源。
304
响应。问题在于,它按预期工作。在Firefox中,更新图像后,新图像会立即加载。但Chrome不行。所以我不确定,您认为这是配置错误而不是Chrome错误吗? - Musterknabe