1. Cache-Control

“Cache-Control” : “cache指令” ,
能让客户端决定是否向服务器发送请求

浏览器的强制策略: 强制刷新:Cache-Control:max-age=0

2.缓存过期情况

服务器返回:Last-Modified,如果该资源没有被修改过,直接返回304状态码即可。

例:If-Modified-Since: Thu, 31 Mar 2016 07:07:52 GMT
该请求首部来向服务器传递保存的 Last-Modified 值。

缺点
一个资源被修改了,但其实际内容根本没发生改变,会因为Last-Modified时间匹配不上而返回了整个实体给客户端

3. etag&If-None-Match

服务器会通过某种算法,给资源计算得出一个唯一标志符(比如md5标志),在把资源响应给客户端的时候,会在实体首部加上“ETag: 唯一标识符”一起返回给客户端

客户端会保留该 ETag 字段,并在下一次请求时将其一并带过去给服务器。服务器只需要比较客户端传来的ETag跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。

如果服务器发现ETag匹配不上,那么直接以常规GET 200回包形式将新的资源(当然也包括了新的ETag)发给客户端;如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。

请求报文中有两个首部字段可以带上 ETag 值:
If-None-Match: “56fcccc8-1699”
告诉服务端如果 ETag 没匹配上需要重发资源数据,否则直接回送304 和响应报头即可。

如果 Last-Modified 和 ETag 同时被使用,则要求它们的验证都必须通过才会返回304,若其中某个验证没通过,则服务器会按常规返回资源实体及200状态码。

4. 实践

使用 Cache-Control 来更精准地利用缓存,然后开启 ETag 跟 Last-Modified 功能进一步复用缓存减少流量。

页面链接的请求常规是无须做长时间缓存的,从而保证回退到页面时能重新发出请求,百度首页是用的 Cache-Control:private,腾讯首页则是设定了60秒的缓存,即 Cache-Control:max-age=60。

而静态资源部分,特别是图片资源,通常会设定一个较长的缓存时间

离线存储

Cache Manifest
详情: HTML5 离线缓存-manifest简介

参考资料

浅谈浏览器http的缓存机制