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

为什么有的缓存是 200 OK (from cache),有的缓存是 304 Not Modified 呢?很简单,看运维是否移除了 Entity Tag。移除了,就总是 200 OK (from cache)。没有移除,就两者交替出现。

最近在做百度云观测的 nginx 配置优化。从知乎上看到这个问题:“阿里云存储如何让浏览器始终以200 (from cache)缓存图片?”,提问者强调 200 OK (from cache) 和 304 Not Modified 的区别,有感而发。

其实, 200 OK (from cache)  是浏览器没有跟服务器确认,直接用了浏览器缓存;而 304 Not Modified 是浏览器和服务器多确认了一次缓存有效性,再用的缓存。

它们都是在设置了缓存的情况下触发的。

那么,两者触发的时机有什么区别呢?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 还真不少呢!

本文并不是说影响浏览器缓存只有 ETag 这一个因素的意思,请大家不要误解。只是就“为什么我加了缓存,有的却是 304 Not Modified, 而不是 200 OK(from cache)”这件事给出一个一针见血的原因和解答。本文也发在了 div.io 上,详细的 ETag 补充知识可以看@hefangshi 补充的评论

转自:

200 OK (from cache) 与 304 Not Modified

时间: 2024-10-13 16:23:22

[web] 200 OK (from cache) 与 304 Not Modified的相关文章

200 OK (from cache) 与 304 Not Modified

解释: 200 OK (from cache)  是浏览器没有跟服务器确认,直接用了浏览器缓存: 304 Not Modified 是浏览器和服务器多确认了一次缓存有效性,再用的缓存. 触发区别: 200 OK (from cache) 是直接点击链接访问,输入网址按回车访问也能触发:而 304 Not Modified 是刷新页面时触发,或是设置了长缓存.但 Entity Tags 没有移除时触发 Last-Modified这个头标是一个响应头标,表示客户端(通常指浏览器)所请求资源在服务器端

200 from memory cache / from disk cache / 304 Not Modified 区别

三者情况有什么区别和联系,什么情况下会发生200 from memory cache 或 200 from disk cache 或 304 Not Modified? 200 from memory cache / from disk cache / 304 Not Modified 区别 >> python 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/python/1010000008991724/200frommemorycachefromdi

304 Not Modified

今天在用chrome浏览淘宝页面的时候,发现很多来自淘宝图片HTTP状态码是 304 Not Modified 到百度搜索了一下,明白了 304状态的含义(以下绿色内容来自网络): 304 Not Modified:客户端有缓冲的文件并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档).服务器告诉客户,原来缓冲的文档还可以继续使用. 如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If

Jersey(1.19.1) - Conditional GETs and Returning 304 (Not Modified) Responses

Conditional GETs are a great way to reduce bandwidth, and potentially server-side performance, depending on how the information used to determine conditions is calculated. A well-designed web site may return 304 (Not Modified) responses for the many

图片缓存:浏览器刷新 和 304 Not Modified 与 If-Modified-Since 及 Cache-Control

关键词:浏览器刷新,304 Not Modified ,If-Modified-Since,Cache-Control,Expires 今天在用chrome浏览淘宝页面的时候,发现很多来自淘宝图片HTTP状态码是 304 Not Modified 到百度搜索了一下,明白了 304状态的含义(以下绿色内容来自网络): 304 Not Modified:客户端有缓冲的文件并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档).服务器告诉客户,原来缓

36 web系统架构及cache基础、varnish4基础应用、varnish状态引擎详解及vcl

02 varnish4基础应用 配置环境: node1 CentOS7.2 192.168.1.131 [[email protected] ~]# yum -y install varnish [[email protected] ~]# vim /etc/varnish/varnish.params 修改 VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G" 为 VARNISH_STORAGE="ma

asp.net页面的304 Not Modified代码与 原理

通过前面的示例,我们已经看到缓存带来的好处:那就是可以减少到服务器的访问,由于不访问服务器就能显示页面,这对于服务器来说, 能减轻一定的访问压力.但是,如果用户强制刷新浏览器,那么浏览器将会忽略缓存页,直接向服务器重新发起请求. 也就是说:缓存页在用户强制刷新浏览器时会无效. 但是,我们之所以使用缓存页,是因为我们希望告诉浏览器:这些数据在一定时间内,并不会发生变化,因此根本不需要再次请求服务器了. 然而,我们不能阻止用户的行为.由于浏览器的重新访问,我们原来设想的缓存想法将会落空,最后的结果是

304 not modified 缓存问题解决

解决这种问题方法很简单,只需在url后面拼接一个时间戳就行了.示例代码如下: this.$http.get('./api/ratings?t='+ (new Date()).getTime().toString())

踩坑koa1.x升级koa2.x及前端工程师面临的新挑战

前言 较早的Nodejs开发者为了实现程序的同步都会使用几个"工具",回调,promise,co,或者是generator.记得写过一个递归删除目录下文件和文件夹的需求,用以上方法都是各种不爽(关键我就是想简单的写个递归啊). 就在前几天Nodejs发布了v7.6.0版本.Nodejs开发者终于不用使用第三方模块就可以使用async和await让自己的程序在不需要异步的地方保持同步的特性了. 就在Nodejs v7.6.0刚发布不久,koa的作者也正式的发布的koa2. 通过网络查询得