浏览器缓存机制其实就是HTTP协议定义的缓存机制(如:Expires;Cache-control等)。但是,也有非HTTP协议定义的缓存机制。例如,使用HTML元标记,Web开发人员可以将标记添加到HTML页面中的节点。代码如下:上面的htmlcode代码的作用是告诉浏览器当前页面不会被缓存,每次访问都需要拉取从服务器。使用起来很简单,但是只有部分浏览器可以支持,所有的缓存代理服务器都不支持,因为代理本身并不解析HTML内容。下面我主要介绍一下HTTP协议定义的缓存机制。Expires策略Expires是Web服务器响应报文的头域,它告诉浏览器在响应http请求时,浏览器可以直接从浏览器缓存中获取过期时间前的数据,而无需再次请求。以下是宝贝PK项目中浏览器拉取的jquery.jsweb服务器的响应头:注:Date头字段表示消息发送的时间,时间的描述格式由rfc822定义。例如,日期:2001年12月31日星期一04:25:57GMT。Web服务器在2012-11-2803:30:01时间点之前告诉浏览器可以使用缓存文件。发送请求的时间是2012-11-2803:25:01,即缓存了5分钟。不过Expires是HTTP1.0的东西,现在浏览器默认使用的是HTTP1.1,所以它的作用基本被忽略了。Cache-control策略(重点)Cache-Control和Expires的作用一样,都是指定当前资源的有效期,控制浏览器是直接从浏览器缓存中取数据,还是重新向服务器发送请求取数据。只是Cache-Control的选项更多,设置更详细。如果同时设置,则其优先级高于Expires。HTTP协议头Cache-Control:取值可以是public,private,no-cache,no-store,no-transform,must-revalidate,proxy-revalidate,max-age每条消息中的说明含义如下:Public表示响应可以是Anybuffercache。Private表示共享缓存无法处理单个用户的全部或部分响应消息。这允许服务器仅为用户描述对其他用户的请求无效的部分响应消息。no-cache表示请求或响应消息不能被缓存。no-store用于防止重要信息被无意中发布。在请求消息中发送它不会导致请求和响应消息都不会使用缓存。max-age表示客户端可以收到生命周期不超过指定时间(以秒为单位)的响应。min-fresh表示客户端可以收到响应时间小于当前时间加上指定时间的响应。max-stale表示客户端可以收到超过超时时间的响应消息。如果您为max-stalemessages指定一个值,那么客户端可以接收超过为超时期限指定的值的响应消息。Last-Modified/If-Modified-Since还是上面的请求,web服务器返回的Cache-Control头的值为max-age=300,即5分钟(和上面的Expires时间一致,这个不需要)。Last-Modified/If-Modified-Since应该与Cache-Control一起使用。Last-Modified:表示该响应资源的最后修改时间。当Web服务器响应请求时,它告诉浏览器资源的最后修改时间。If-Modified-Since:当资源过期(使用Cache-Control标识的max-age),发现资源有Last-Modified语句,则向web服务器添加headerIf-Modified-Since再次指示请求时间。web服务器收到请求后,发现有一个headerIf-Modified-Since,将其与请求资源的最新修改时间进行比较。如果***的修改时间较新,说明该资源又被修改过,则响应整个资源内容(写在响应消息体中),HTTP200;如果***的修改时间比较老,说明该资源没有新的修改,则响应HTTP304(无包体,保存浏览),告诉浏览器继续使用保存的缓存。Etag/If-None-Match也应该与Cache-Control一起使用。Etag:Web服务器响应请求时,告诉浏览器当前资源在服务器上的唯一标识(生成规则由服务器决定)。在Apache中,ETag的值默认是通过对文件的索引节点(INode)、大小(Size)和最新修改时间(MTime)进行哈希计算得到的。If-None-Match:资源过期时(使用Cache-Control标识的max-age),发现资源有Etage语句,添加headerIf-None-Match(Etag的值)当再次向Web服务器发出请求时。Web服务器收到请求后,发现有一个headerIf-None-Match,然后将其与请求资源对应的验证字符串进行比较,决定返回200或304。为什么Etag来自Last-Modified呢?你可能认为使用Last-Modified就足以让浏览器知道本地缓存副本是否足够新。为什么需要Etag(实体标识)?HTTP1.1中Etag的出现主要是为了解决Last-Modified的几个难题:Last-Modified标记的最后一次修改只能精确到秒级。有的文件如果1秒内修改了很多次,就不能准确标注文件的修改时间如果有的文件是定时生成的,有时候内容没变,但是Last-Modified变了,导致文件无法显示使用缓存。有可能服务器没有准确获取文件修改时间,或者代理服务器时间不一致等情况Etag是服务器自动生成或者开发者生成的相应资源在服务器端的唯一标识,可以更准确地控制缓存。Last-Modified和ETag可以一起使用。服务器会先验证ETag。如果一致,就会继续比较Last-Modified,最后决定是否返回304。用户行为与缓存浏览器缓存行为和用户行为有关!!!浏览器第一次请求总结:浏览器再次请求时:【本文为专栏作者“谢君”原创稿件,转载可通过作者微信公众号(jingfeng18)取得联系】点此阅读更多这个作者的好文章