• HTTP请求中浏览器的缓存机制(转)


    摘要:在Web开发过程中,我们可能会经常遇到浏览器缓存的问题。本文作者详细解释了浏览器缓存的机制,帮助读者更深层次的认识浏览器的缓存。

      流程

      当资源第一次被访问的时候,HTTP头部如下

    (Request-Line) GET /a.html HTTP/1.1
    Host
    127.0.0.1
    User-Agent Mozilla/
    5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
    Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language zh-cn,zh;q=0.5
    Accept-Encoding gzip,deflate
    Accept-Charset gb2312
    ,utf-8;q=0.7,;q=0.7
    Keep-Alive 300
    Connection keep-alive

    HTTP返回头部如下

    (Status-Line) HTTP/1.1200 OK
    Date Thu
    ,26 Nov 200913:50:54 GMT
    Server Apache/
    2.2.11 (Unix) PHP/5.2.9
    Last-Modified Thu
    ,26 Nov 200913:50:19 GMT
    Etag
    "8fb8b-14-4794674acdcc0"
    Accept-Ranges bytes
    Content-Length
    20
    Keep-Alive timeout
    =5, max=100
    Connection Keep-Alive
    Content-Type text/html

    当资源第一次被访问的时候,http返回200的状态码,并在头部携带上当前资源的一些描述信息,如

    Last-Modified // 指示最后修改的时间
    Etag // 指示资源的状态唯一标识
    Expires // 指示资源在浏览器缓存中的过期时间

      接着浏览器会将文件缓存到Cache目录下,并同时保存文件的上述信息

      当第二次请求该文件时,浏览器会先检查Cache目录下是否含有该文件,如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求

      如果文件此时已经过期,则浏览器会发送一次HTTP请求到WebServer,并在头部携带上当前文件的如下信息

    If-Modified-Since Thu,26 Nov 200913:50:19 GMT
    If-None-Match
    "8fb8b-14-4794674acdcc0"

      即把上一次修改的时间,以及上一次请求返回的Etag值(注:即为If-None-Match)一起发送给服务器。服务器在接收到这个请求的时候,先解析Header里头的信息,然后校验该头部信息。

      如果该文件从上次时间到现在都没有过修改或者Etag信息没有变化,则服务端将直接返回一个304的状态,而不再返回文件资源,状态头部如下

    (Status-Line) HTTP/1.1304 Not Modified
    Date Thu
    ,26 Nov 200914:09:07 GMT
    Server Apache/
    2.2.11 (Unix) PHP/5.2.9
    Connection Keep-Alive
    Keep-Alive timeout
    =5, max=100
    Etag
    "8fb8b-14-4794674acdcc0"

      这样,就能够很大程度上减少网络带宽以及提升用户的浏览器体验。

      当然,如果服务器经过匹配发现文件修改过了,就会将文件资源返回,并带上新文件状态信息。

      基本字段

      Pragma

      Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。

      Expires

      文件在本地缓存的过期时间,如果浏览器发现缓存中的文件没有过期,则不发送请求(有例外,后面介绍)

      Cache-Control

      Cache -Control指定请求和响应遵循的缓存机制。 //   怎么理解?

      在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括

    no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached

    响应消息中的指令包括

    public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age

      各个消息中的指令含义如下:

    1. Public指示响应可被任何缓存区缓存。

    2. Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

    3. no-cache指示请求或响应消息不能缓存

    4. no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

    5. max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

    6. min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

    7. max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

      Etag/If-None-Match

      一对验证文件实体的标记“Entity Tag”的响应/请求头Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的

      Last-Modified/If-Modified-Since

      一对验证文件的修改时间的响应/请求头

      Expires、Cache-Control、Last-Modified、ETag是RFC 2616(HTTP/1.1)协议中和网页缓存相关的几个字段。

      前两个用来控制缓存的失效日期,浏览器可通过它来判定,需不需要发出HTTP请求;

      后两个用来验证网页的有效性,服务器端利用它来验证这个文件是否需要重新返回

      Last-Modified VS Etag

      既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。

      不同的情况

      上面描述的是一个普通的浏览器缓存状态,在实际应用中,如页面跳转(点击页面链接跳转,window.open,在地址栏敲回车,刷新页面)等操作,会有一些区别

      普通页面跳转

      普通页面跳转包括链接点击跳转,用js脚本打开新页面(window.open)

      无缓存情况下,请求会返回所有资源结果

      设置Expires并且未过期时,浏览器将不会发出http请求

      如果Expires过期,则会发送相应请求,并附带上Last-Modifed等信息,供服务器校验

      页面刷新(F5)

      这种情况一下,一般会看到很多304的请求,就是说即便资源设置了Expires且未过期,浏览器也会发送相应请求

      IE和FF稍有区别

      IE:

    If-Modified-Since Wed,18 Nov 200915:54:52 GMT
    If-None-Match
    "2360492659"
    Pragma: no-cache // 禁止缓存

      FF:

    If-Modified-Since Wed,18 Nov 200915:54:52 GMT
    If-None-Match
    "2360492659"
    Cache-Control max-age
    =0 // 文件立即过期

      强制刷新(Ctrl+F5)

      效果和无缓存时候一致,返回200的结果

      一些特殊的资源

      IFRAME

      FLASH

      异步获取的数据

      待研究……

    转自:http://kb.cnblogs.com/page/73901/

    --------------------------------------------------------Cache Control HTTP 1.1中用----------------------------------------------------------------------

    http://blog.csdn.net/youngerchen/article/details/6116147

    HTTP协议分别在 1.0 / 1.1 两个时代推出了 Expires / Cache-control 两种cache策略,这里我们无需了解全部的细节,无需记住整个RFC内容,但是当我们需要使用HTTP cache策略时,我们需要注意以下细节:
    Expires 是HTTP 1.0 那个时代的东西了,目前来看,可以不使用了,因为HTTP 1.0 的user agent占有率在 0.1% 以下(我们主要面向的web浏览器均默认使用HTTP 1.1),Cache-control 是 HTTP 1.1 的新特性,也是我们主要做文章使用cache策略的工具.

    Cache策略:
    #1 保鲜期only 
    这个是最最基础的一种策略,只需要在响应头中设定:
    Cache-control: max-age=[secs]
    [secs]是cache在客户端存活的秒数,例如 Cache-control: max-age=1800 表明cache的时间是半小时,只使用这样一个声明就可以使浏览器能够将这个HTTP响应的内容写入临时目录做cache. 

    PS:http://www.itlearner.com/article/4877

    因为Expires头使用一个特定的时间,它要求服务端和客户端的时钟严格同步;另外,过期日期需要经常检查,一旦过期日期到了,需要在服务器中配置提供一个新的日期。所以,HTTP1.1引入了Cache-Control头来克服Exipres头的限制。Cache-Control使用max-age指令指定组件被缓存多久,它以秒为单位定义了一个更新窗。使用带有max-age的Cache-Control可以消除Expires的限制,但对于不支持HTTP1.1的应用,仍希望使用Expires头。可以同时制定这两个响应头,如果两者同时出现时,HTTP规范规定max-age指令将重写Expires头。

  • 相关阅读:
    英语中的合成词
    超声诊断装置的质量评价
    图像处理的数学方法zz
    超声射频信号的产生(RF Signal)
    黄帝内经——春夏秋冬养生之道zz
    超声仿真软件Field II的使用
    水木上关于超声图像增强的讨论
    TWaver HTML5 + Node.js + express + socket.io + redis(五)
    如何用Swing去绘制电力系统图
    TWaver在FTTX设备网管系统中的应用
  • 原文地址:https://www.cnblogs.com/wxdlut/p/3298254.html
Copyright © 2020-2023  润新知