为何有的缓存是 200 OK (from cache),有的缓存是 304 Not Modified 呢?很简单,看运维是否移除了 Entity Tag。移除了,就老是 200 OK (from cache)。没有移除,就二者交替出现。html
最近在作百度云观测的 nginx 配置优化。从知乎上看到这个问题:“阿里云存储如何让浏览器始终以200 (from cache)缓存图片?”,提问者强调 200 OK (from cache) 和 304 Not Modified 的区别,有感而发。nginx
其实, 200 OK (from cache) 是浏览器没有跟服务器确认,直接用了浏览器缓存;而 304 Not Modified 是浏览器和服务器多确认了一次缓存有效性,再用的缓存。web
它们都是在设置了缓存的状况下触发的。浏览器
那么,二者触发的时机有什么区别呢?200 OK (from cache) 是直接点击连接访问,输入网址按回车访问也能触发;而 304 Not Modified 是刷新页面时触发,或是设置了长缓存、但 Entity Tags 没有移除时触发。这是通过查阅资料得出的结论。博主实际测试了一下,结论与之相符:缓存
图1 – 直接访问有缓存的网站都触发 200 OK (from cache)
图2 – 刷新浏览器则会触发 304 Not Modified
图3 – 同一域名下,没有 Entity Tag 的资源直接访问,是 200 OK (from cache) 的结果
图4 – 同一域名下,有 Entity Tag ,直接访问就会触发 304 Not Modified安全
如今通常都会设置长时间的缓存,正确设置方式参考这两篇笔记:服务器
搜索了一下,发现这个问题,在网络上并尚未定论,也没发现有人去实测。网络
想一想也对,如今网络那么快,304 Not Modified 仍是 200 OK (from cache),若是不是较真地追求速度,可能你们都以为区别不大,从而也就没发现这个问题了。运维
博主截图的域名是某著名 IT 公司的 CDN(已反馈)。可见犯这个错误的运维 GG 还真很多呢!post
本文并非说影响浏览器缓存只有 ETag 这一个因素的意思,请你们不要误解。只是就“为何我加了缓存,有的倒是 304 Not Modified, 而不是 200 OK(from cache)”这件事给出一个一针见血的缘由和解答。本文也发在了 div.io 上,详细的 ETag 补充知识能够看 @hefangshi 补充的评论。
转自: