1. 浏览器缓存知识:
http://www.cnblogs.com/lyzg/p/5125934.html
强缓存:强缓存是利用Expires或者Cache-Control这两个http response header实现的,它们都用来表示资源在客户端缓存的有效期。
(1)浏览器在接收到这个资源后,会把这个资源连同所有response header一起缓存下来(所以缓存命中的请求返回的header并不是来自服务器,而是来自之前缓存的header);
(2)浏览器再请求这个资源时,先从缓存中寻找,找到这个资源后,拿出它的Expires跟当前的请求时间比较,如果请求时间在Expires指定的时间之前,就能命中缓存,否则就不行。
(3)如果缓存没有命中,浏览器直接从服务器加载资源时,Expires Header在重新加载的时候会被更新。
Expires是较老的强缓存管理header,由于它是服务器返回的一个绝对时间,在服务器时间与客户端时间相差较大时,缓存管理容易出现问题,比如随意修改下客户端时间,就能影响缓存命中的结果。所以在http1.1的时候,提出了一个新的header,就是Cache-Control,这是一个相对时间,在配置缓存的时候,以秒为单位,用数值表示,如:Cache-Control:max-age=315360000.。发请求时,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则就不行。
协商缓存:
协商缓存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的。
Last-Modified,If-Modified-Since: request请求头里加入上次修改内容的时间,如果从那时起内容没有修改过,则回复304,命中缓存。
【ETag、If-None-Match】:request头里加入上次修改后形成的hashcode,如果从那时起内容没修改过,那hashcode也没变,response304,命中缓存。(分布式服务器不能用这种缓存,因为相同内容会生产不同的hashcode(可能hashcode的生产函数定义的是和机器相关的。))
(可能只针对IE)
当ctrl+f5强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;
当f5刷新网页时,跳过强缓存,但是会检查协商缓存;