http缓存之lastModified和etag
1、cache-control
访问资源
首次访问页面时间:2018.2.1 9:56 (当前时间=GMT时间+8h)
缓存时长max-age:1 day
Expire缓存失效时间:2018.2.2 9:56 (GMT+8h)
F5刷新页面,失效时间不变,还是2018.2.2 9:56失效
缓存时间:max-age:86400 即缓存1天
如果用户第一次去访问,服务器返回200 ok,并且缓存资源,那么浏览器会记录下这次的请求时间,以这个时间T1为基准(如果是F5刷新,这个T1是不会变化的,但是使用ctrl+F5强制刷新会改变这个值),T1+1day,就是这个资源的失效时间。在未失效之前,再F5刷新(此处不包括ctrl+f5强制刷新,后面会说这个问题),重新请求该资源,是不需要向服务器发出请求的,直接使用本地缓存资源,status是200 from disk cache。所以这个时候如果使用过抓包工具会发现是没有请求的。只有到T1+1day这个时间点,缓存失效后,浏览器才会向服务器发出请求,然后服务端根据判断决定返回200 还是 304.

接着 Ctrl+F5强制刷新,会发现Expire缓存失效时间也发生了变化,而且请求头中出现了cache-control:no-cache,http状态成了200 ok。
分析原因:
首先,Expire缓存失效时间变化,这个是因为强制刷新后,失效时间的计算基准T1发生了变化,所以expire就是这个新的T1时间+1day。其次请求头中出现了cache-control:no-cache,这就告诉浏览器无论缓存是否失效都要请求一次服务器,并且返回状态是200,(不是304,即使资源未发生变化,etag未改变,也返回的是200 ok,这个和百度百科上的解释有点不一样,按说资源未发生改变,应该是304才对,没想明白)


2、lastModified
只有lastModified时,没有设置etag,浏览器首次请求会是200 ok,接着刷新页面会是200 from disk cache,继续刷新,基本都是读取缓存,停一会儿再刷新,会返回304 Not Modified,继续连续刷新又会出现200 from disk cache。只要文件不发生变化,请求会在200 from cache 和304 Not Modified之间变化。猜测只设置lastModified时,浏览器会默认有一定的缓存时间,大概10-20秒左右,所以会出现直接从硬盘读取缓存的情况。只有当服务器设置了缓存时间,才会覆盖浏览器默认的缓存时间。

如果修改了文件,文件的lastModified发生变化,如果此时客户端刚好需要同服务器同步一次信息,那么这个改动会立即生效,返回 200 OK。否则的话,需要下次和服务器同步信息时才能生效。

如果服务器应答中包括一个ETag,又包括一个Last-Mofidied值,则客户端在发送请求时使用两种证实机制,并且只有当两种证实机制都满足时才会返回304 Not Modified。
参考:http://www.phppan.com/2012/12/http-cache-algorithm/
http缓存之lastModified和etag的更多相关文章
- 缓存验证Last-Modified和Etag的使用
缓存工作示意图: 在http协议里面,数据的验证方式,主要有两个验证头:Last-Modified 和 Etag. Last-Modified 配合Last-Modified-Since或者If-Un ...
- Last-Modified、ETag、Expires和Cache-Control
前言 在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Rep ...
- Django添加Last-Modified和ETag
用Django REST Framework做的REST API,其中有个API有这样的需求: APP端请求这个API,服务器端从数据库读数据,返回json.返回的数据量稍微有些大,但是可能一年才修改 ...
- http响应Last-Modified和ETag(转)
基础知识 1) 什么是”Last-Modified”? 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期 ...
- Last-Modified和ETag以及Apache和Nginx中的配置
1) 什么是”Last-Modified”? 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修 ...
- 16:django 有条件的视图处理(Last-Modified和ETag)&&加密签名
有条件的视图处理 上一节我们介绍了缓存来减轻服务器的负担,这里的有条件的视图处理也从一定程度上减轻了服务器的负担,在正式介绍之前,先来看两个概念:Last-Modified和ETag Last-Mod ...
- 缓存验证Last-Modifie和Etag的使用
看这张图,是浏览器发出请求到请求缓存到过程,这么一个原理 那么http里面如何进行验证呢?主要有两个验证到http头 Last-Modified(上次修改时间) 主要配合If-Modified-Sin ...
- http响应Last-Modified和ETag
http响应Last-Modified和ETag [日期:2008-06-16] 来源: 作者: [字体:大 中 小] 基础知识 1) 什么是”Last-Modified”? 在浏览器第一次请求某一 ...
- Expires、Last-Modified、Etag缓存控制
当请求一个页面时,如果浏览器使用本地缓存,因此我们经常会看到一个HTTP请求为304状态.或者显示200状态,在chrome下标注是from cache,在火狐下会标注BFCache: 我们希望在服务 ...
随机推荐
- 谁是性能杀手?Kafka多Topic下启用SSL时延增大问题分析
问题背景 项目中将Kafka接口进行RESTful封装,在使用RESTful接口进行性能测试时,发现Topic数增多后,开启SSL与非SSL进行测试,发现开启SSL后性能下降得厉害.例如600个Top ...
- mac WebStorm 破解
摘要:因为想要学习HTML所以需要一个工具,同事推荐了webstorm.下载以后再网上搜破解方法.搜索到一个很简单的. 一.下载链接https://www.jetbrains.com/webstorm ...
- PartialView中的页面重定向
在MVC的每个action中,都可以指定一种返回页面的类型,可以是ActionResult,这表示返回的页面为view或者是一个PartialView,前台是一个全整页面,后台是页面的一部分. 在以A ...
- HDU1251 统计难题 【trie树】
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
- aspx后台引用不到服务器控件
从其他地方拷贝的页面到自己的项目,后台CS代码引用hidden时,提示找不到,百度,发现可能是网站项目和Web应用程序的区别,右键aspx转化为Web应用程序即可.
- 为Windows Live Writer添加Code插件
1.插件效果展示 1: void CDemoDlg::OnBnClickedNmdlg() 2: { 3: CNonModeDlg *pDlg = new CNonModeDlg();// 创建一个C ...
- python 获取代码宿主机名 ip
1.获取hostname 相同代码 不同宿主机 日志名 互异 且 可识别宿主机 分布式爬虫 https://docs.python.org/3.6/library/socket.html#socket ...
- jetty与tomcat
相同点: 1.tomcat与jetty都是一种servlet引擎,他们都支持标准的servlet规范和javaEE规范 不同点: 1.架构比较 jetty相比tomcat更为简单 jetty架构是基于 ...
- 有关 enum的重新理解
有关enum 的再次理解: 所有的枚举都继承自java.lang.Enum类. 说到底enum也只是一个java类,只不过他有几个特殊的点. 1.enum中的各个实例,就是enum的static实 ...
- mac系统下显示隐藏文件
在终端上输入以下命令即可: 显示隐藏文件命令: defaults write com.apple.finder AppleShowAllFiles -bool true 不显示隐藏文件命令: defa ...