1、Last-Modified

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记(HttpReponse Header)此文件在服务期端最后被修改的时间,格式类似这样:

Last-Modified:Tue, 24 Feb 2009 08:01:04 GMT

客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送If-Modified-Since报头(HttpRequest Header),询问该时间之后文件是否有被修改过:

If-Modified-Since:Tue, 24 Feb 2009 08:01:04 GMT

如果服务器端的资源没有变化,则自动返回HTTP304(NotChanged.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

注:如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,会认为是个非法请求

2、Etag工作原理

HTTP协议规格说明定义ETag为“被请求变量的实体标记”(参见14.19)。简单点即服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式:

Etag:“5d8c72a5edda8d6a:3239″

客户端的查询更新格式是这样的:

If-None-Match:“5d8c72a5edda8d6a:3239″

如果ETag没改变,则返回状态304。

即:在客户端发出请求后,HttpReponse Header中包含Etag:“5d8c72a5edda8d6a:3239″

标识,等于告诉Client端,你拿到的这个的资源有表示ID:5d8c72a5edda8d6a:3239。当下次需要发Request索要同一个URI的时候,浏览器同时发出一个If-None-Match报头(Http RequestHeader)此时包头中信息包含上次访问得到的Etag:“5d8c72a5edda8d6a:3239″标识。

If-None-Match:“5d8c72a5edda8d6a:3239“

,这样,Client端等于Cache了两份,服务器端就会比对2者的etag。如果If-None-Match为False,不返回200,返回304(Not Modified) Response。

3、Expires

给出的日期/时间后,被响应认为是过时。如Expires:Thu, 02 Apr 2009 05:14:08 GMT

需和Last-Modified结合使用。用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端.当缓存中数据失效或过期,才决定从服务器更新数据。

4、Last-Modified和Expires

Last-Modified标识能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而且要和Expires一起用。而Expires标识却使得浏览器干脆连HTTP请求都不用发,比如当用户F5或者点击Refresh按钮的时候就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以,Last-Modified还是要用的,而且要和Expires一起用。

5、Etag和Expires

如果服务器端同时设置了Etag和Expires时,Etag原理同样,即与Last-Modified/Etag对应的HttpRequestHeader:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和WebServer发出的Last-Modified,Etag值完全一样;在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.

6、Last-Modified和Etag

分布式系统里多台机器间文件的last-modified必须保持一致,以免负载均衡到不同机器导致比对失败

分布式系统尽量关闭掉Etag(每台机器生成的etag都会不一样)

Last-Modified和ETags请求的http报头一起使用,服务器首先产生Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改,来决定文件是否继续缓存

过程如下:

1.客户端请求一个页面(A)。

2.服务器返回页面A,并在给A加上一个Last-Modified/ETag。

3.客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。

4.客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。

5.服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

注:

1、Last-Modified和Etag头都是由WebServer发出的HttpReponse Header,WebServer应该同时支持这两种头。

2、WebServer发送完Last-Modified/Etag头给客户端后,客户端会缓存这些头;

3、客户端再次发起相同页面的请求时,将分别发送与Last-Modified/Etag对应的HttpRequestHeader:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和WebServer发出的Last-Modified,Etag值完全一样;

4、通过上述值到服务器端检查,判断文件是否继续缓存;

7、关于 Cache-Control: max-age=秒 和 Expires

Expires = 时间,HTTP 1.0 版本,缓存的载止时间,允许客户端在这个时间之前不去检查(发请求)

max-age = 秒,HTTP 1.1版本,资源在本地缓存多少秒。

如果max-age和Expires同时存在,则被Cache-Control的max-age覆盖。

Expires 的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代。

Expires =max-age +   “每次下载时的当前的request时间”

所以一旦重新下载的页面后,expires就重新计算一次,但last-modified不会变化

转载于:https://blog.51cto.com/195175108/1867187

86-浏览器缓存中的部分变量简析相关推荐

  1. Android 边播放边缓存视频框架:AndroidVideoCache简析

    一.背景 现在的移动应用,视频是一个非常重要的组成部分,好像里面不搞一点视频就不是一个正常的移动App.在视频开发方面,可以分为视频录制和视频播放,视频录制的场景可能还比较少,这方面可以使用Googl ...

  2. APP:校园网登录app—中小南—源码简析

    转载请注明出处:http://www.cnblogs.com/wondertwo/p/5392496.html 最近一段时间真的很惭愧,一直琐事缠身没有空闲的时间来安安心心写一篇博客,直到今晚基本忙完 ...

  3. C++中for循环语句简析

    1 for循环语句概述 for循环语句的语法是 for(初始化语句; 条件语句; 表达式语句) { 执行语句; } 其中,初始化语句用于每次循环过程中都要修改的变量进行初始化:而条件语句用来控制循环, ...

  4. URL链接中的utm_source,utm_medium简析

    工作中须要分析一些链接,统计分析一些信息.比方例如以下的链接: http://lightapplication.xxxx.com/?utm_source=ucweb&utm_medium=cp ...

  5. spring中对浏览器缓存的控制

    我们平常在页面发送一个url请求的时候,会通过网络去服务器获取这个资源,网速好的时候倒是没什么,但是网络差一点的话,资源获取的延时就会很长,用户体验就会大大降低.但是我们可以使用缓存来解决这个问题. ...

  6. 如何在所有主要浏览器中清除浏览器缓存(快速方式)

    When fixing common WordPress errors, one common piece of advice that you would often receive is to & ...

  7. 浏览器缓存机制(强缓存和协商缓存)总结

    文章目录 前言 缓存过程的分析 强缓存 Expires Cache-Control 协商缓存 Last-Modified和If-Modified-Since ETag和If-None-Match 两者 ...

  8. 同源策略禁止读取位于_用浏览器缓存绕过同源策略(SOP)限制

    本文分享的Writeup是作者在做Keybase.io的漏洞众测中发现的SOP(同源策略)绕过漏洞,由于Keybase.io在用的多个API端点都启用了CORS(跨域资源共享)机制,这种缓解同源策略的 ...

  9. 浏览器缓存导致FLASH资源更新问题的解决方案

    在网上搜浏览器缓存问题时,遇上了很多问题.一是不知道应该用何种关键字搜索,二是一搜出来,就全是讲的是如何禁用浏览器缓存的方案. 作为大型点的FLASH WEBGAME来说,不缓存显然是不行的.总体上来 ...

最新文章

  1. SVN详解-linux+windows
  2. 嵌入式系统的组成、嵌入式处理器分类总结、ARM处理器系列总结、ARM Cortex-M3体系结构总结!
  3. PMCAFF微课堂 | 京东零售平台资深PM深度揭秘京东的订单体系
  4. NYOJ-42 一笔画问题
  5. springBoot整合Listener
  6. Could NOT find SDL_image (missing:SDL_IMAGE_LIBRARIES SDL_IMAGE_INCLUDE_DIRS)
  7. 数据库:为什么阿里巴巴禁止使用存储过程?
  8. Algorithm I assignment Collinear
  9. endl与'\n'的区别
  10. 数据结构与算法之美-排序(下)
  11. Consul在.Net Core中初体验
  12. ORACLE 11G DATA GUARD配置之Dataguard简介
  13. 新势力首家 小鹏汽车正式纳入港股通!
  14. onpostexecute 中更新adapter 事变_Mac音频转换器----Adapter
  15. 字节跳动面试必问:撸了大神写的spring源码笔记
  16. CodeForces - 946C String Transformation
  17. SpringCloud项目接入Nacos服务治理
  18. 《BPF( 伯克利数据包过滤器 ) Performance Tools》 第二章 技术背景
  19. win10网络适配器不见了_win10没有网络适配器怎么办
  20. 电脑截屏怎么固定到屏幕 截图放在桌面上

热门文章

  1. C++ 求直角三角形面积
  2. flutter开发实战-flutter二维码条形码扫一扫功能实现
  3. 全网最全-HR面试高频问题-求职宝典
  4. java中''和单双引号有什么区别
  5. 基于uniapp的活动报名系统源码
  6. Android开发中ExpandableListView的基本用法(总结)
  7. 2021-2027中国软木胶合板市场现状及未来发展趋势
  8. CSS中的 overflow 属性
  9. https://blog.csdn.net/m0_46128094/article/details/115002055?spm=1001.2014.3001.5501
  10. Presto RBO 之Limit 下推优化