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的更多相关文章

  1. 缓存验证Last-Modified和Etag的使用

    缓存工作示意图: 在http协议里面,数据的验证方式,主要有两个验证头:Last-Modified 和 Etag. Last-Modified 配合Last-Modified-Since或者If-Un ...

  2. Last-Modified、ETag、Expires和Cache-Control

    前言 在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Rep ...

  3. Django添加Last-Modified和ETag

    用Django REST Framework做的REST API,其中有个API有这样的需求: APP端请求这个API,服务器端从数据库读数据,返回json.返回的数据量稍微有些大,但是可能一年才修改 ...

  4. http响应Last-Modified和ETag(转)

    基础知识 1) 什么是”Last-Modified”? 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期 ...

  5. Last-Modified和ETag以及Apache和Nginx中的配置

    1) 什么是”Last-Modified”? 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修 ...

  6. 16:django 有条件的视图处理(Last-Modified和ETag)&&加密签名

    有条件的视图处理 上一节我们介绍了缓存来减轻服务器的负担,这里的有条件的视图处理也从一定程度上减轻了服务器的负担,在正式介绍之前,先来看两个概念:Last-Modified和ETag Last-Mod ...

  7. 缓存验证Last-Modifie和Etag的使用

    看这张图,是浏览器发出请求到请求缓存到过程,这么一个原理 那么http里面如何进行验证呢?主要有两个验证到http头 Last-Modified(上次修改时间) 主要配合If-Modified-Sin ...

  8. http响应Last-Modified和ETag

    http响应Last-Modified和ETag [日期:2008-06-16] 来源:  作者: [字体:大 中 小] 基础知识 1) 什么是”Last-Modified”? 在浏览器第一次请求某一 ...

  9. Expires、Last-Modified、Etag缓存控制

    当请求一个页面时,如果浏览器使用本地缓存,因此我们经常会看到一个HTTP请求为304状态.或者显示200状态,在chrome下标注是from cache,在火狐下会标注BFCache: 我们希望在服务 ...

随机推荐

  1. Java 8中的时间

    Java 8中的时间 学习了:https://blog.csdn.net/sun_promise/article/details/51383618

  2. JVM原理及内存溢出

    JVM原理及内存溢出

  3. android事件分发(二)

    非常早之前写过一篇android事件分发的博客,主要写的是它是怎样分发的,具体非常多原理的东西都没有涉及到.今天就从源代码看android怎样控制它的分发机制. 鉴于手机屏幕的限制,所以android ...

  4. ACdream原创群赛(13)のwuyiqi退役专场 C True love

    True love Time Limit: 4000/2000 MS (Java/Others)     Memory Limit:128000/64000 KB (Java/Others) Prob ...

  5. OO模式-Composite

    组合模式也叫做"部分-总体"模式,这样事实上定义也就非常明显了,正好和数据结构的知识相相应.把对象组合成树形结构以表示"部分-总体"的层次结构. 先看类图: w ...

  6. 深度学习笔记之关于基本思想、浅层学习、Neural Network和训练过程(三)

    不多说,直接上干货! 五.Deep Learning的基本思想 假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表示为: I =>S1=>S2=>….. ...

  7. c语言学习-指针探究

    1:指针定义格式:格式:变量类型 *变量名用途:指针变量用于储存地址(only),也就是根据地址值,访问对应的存储空间. 注意.int *p 只能指向int类型的数据: 例: int a = 20; ...

  8. spring依赖注入(反转控制)

    SPRING依赖注入机制(反转控制)解析 Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的 Service对象,还是持久层的DAO对象,都可在Spring的 ...

  9. What's the difference between jquery.js and jquery.min.js?

    They are both the same functionally but the .min one has all unnecessary characters removed in order ...

  10. springmvc的异常统一处理

    在项目实际开发中,异常的统一处理是一个常态.假如不使用异常统一处理,我们往往需要在service层中捕获异常,并且根据不同的异常在result中的设置不同的code并给予相应的提示.这样可能会导致不同 ...