浏览器 HTTP 协议缓存机制

  1.浏览器缓存分两种  一种是HTMLmeta 标签 和 HTTP头信息。

   1) HTML meta  是嵌入到HTMLHeader标签中。如下:

/**
* 告诉浏览器当前页面不能被浏览器缓存
* 使用上很简单,但只有部分浏览器可以支持,
* 而且所有缓存代理服务器都不支持,
* 因为代理不解析HTML内容本身。
* 而广泛应用的还是 HTTP头信息来控制缓存

*/
<
meta HTTP-EQUIV="Pragma" content="no-cache" />

   2.HTTP协议缓存

    1) Expires策略

      Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。不过Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用      HTTP 1.1,所以它的作用基本忽略。Expires 的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大(比如时钟不同步,或者跨时区),那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代。

     2)Cache-control策略(重点关注):Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires

 

 值可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age 各个消息中的指令含义如下:
 Public指示响应可被任何缓存区缓存。
 Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
 no-cache指示请求或响应消息不能缓存,该选项并不是说可以设置”不缓存“,容易望文生义~ 
 no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存,完全不存下來。
 max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
 min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
 max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

 

 3)Last-Modified/If-Modified-Since:Last-Modified/If-Modified-Since要配合Cache-Control使用。

  

header("cache-control:max-age=5,must-revalidate");            //缓存时间
   header ("last-modified: " . gmdate ('D,d y m H:i:s')."GMT");   
   header ("expires: " . gmdate ("D,d y m H:i:s", time()+5)."GMT");

 

   4)  不缓存页面

   

header("pragma:no-cache");
header("cache-control:no-cache");

  5) Etag/If-None-Match:Etag/If-None-Match也要配合Cache-Control使用

       Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。 If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。

你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

  Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag一起使用时,服务器会优先验证ETag

 

    

posted @ 2016-07-04 14:30  拼搏的豆子  阅读(234)  评论(0编辑  收藏  举报