[web] 200 OK (from cache) 与 304 Not Modified

为何有的缓存是 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 没有移除时触发。这是通过查阅资料得出的结论。博主实际测试了一下,结论与之相符:缓存

直接访问有缓存的网站都触发 200 OK (from cache)图1 – 直接访问有缓存的网站都触发 200 OK (from cache)刷新浏览器会触发 304 Not Modified图2 – 刷新浏览器则会触发 304 Not Modified同一域名下,没有 Entity Tag 的资源直接访问,是 200 OK (from cache) 的结果图3 – 同一域名下,没有 Entity Tag 的资源直接访问,是 200 OK (from cache) 的结果同一域名下,有 Entity Tag ,直接访问就会触发 304 Not Modified图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 补充的评论

 

转自:

200 OK (from cache) 与 304 Not Modified

相关文章
相关标签/搜索