关于HTTP缓存
http缓存
每次浏览器请求前会先访问浏览器缓存,查找缓存结果和缓存标识(上次响应头中的字段),然后根据标识决定是否使用缓存。
强制缓存
Cache-Control :
-
"max-age = <seconds>"
设置指令从请求开始,允许响应被重用的时间,不向服务器发送请求,直接取浏览器缓存. -
public
表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,不是必须.声明max-age就OK -
private
表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它) -
no-store
直接禁止浏览器以及中间代理缓存,每次都下载完整的响应 -
no-cache
在使用已存储的缓存数据前,发送带验证器(ETag)的请求到服务器.
在浏览器中,资源都会在硬盘中缓存,但是js和图片等文件还会在内存缓存中, 这样刷新页面就直接从内存缓存中读取(from memory cache),css其他资源从硬盘读取(from disk cache), 关闭页面除了内联资源都从新打开都会从硬盘读取。
协商缓存
就是强制缓存失效的情况下, 浏览器带上缓存标识向服务器发起请求, 由服务器根据缓存标识决定是否使用缓存。返回304让浏览器直接使用缓存或者返回200和结果。
控制协商缓存的字段分别有:Last-Modified / If-Modified-Since和Etag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。
Last-Modified 是服务器响应头里面的标识该资源在服务器最后被修改的时间, 客户端请求头带上这个值放到If-Modified-Since 字段发给服务器, 服务器检查资源最后被修改时间大于这个值就返回200新资源,否则304.
Etag 是服务器响应头里面当前资源的唯一标识,If-None-Match是客户端再次请求时带上上次返回的Etag值,服务器收到后与该资源在服务器的Etag对比,一致返回304,不一致返回200和新资源。