Web缓存能够分为这几种:浏览器缓存、CDN缓存、服务器缓存、数据库数据缓存 。由于可能会直接使用副本免于从新发送请求或者仅仅确认资源没变无需从新传输资源实体,Web缓存能够减小延迟加快网页打开速度、重复利用资源减小网络带宽消耗、下降请求次数或者减小传输内容从而减轻服务器压力。前端
这篇文章主要讨论和前端密切相关的浏览器HTTP缓存机制。浏览器HTTP缓存能够分为强缓存和协商缓存。强缓存和协商缓存最大也是最根本的区别是:强缓存命中的话不会发请求到服务器(好比chrome中的200 from memory cache),协商缓存必定会发请求到服务器,经过资源的请求首部字段验证资源是否命中协商缓存,若是协商缓存命中,服务器会将这个请求返回,可是不会返回这个资源的实体,而是通知客户端能够从缓存中加载这个资源(304 not modified)。chrome
浏览器HTTP缓存由HTTP报文的首部字段决定数据库
控制强缓存的字段按优先级介绍浏览器
**1.Pragma **缓存
Pragma是HTTP/1.1以前版本遗留的通用首部字段,仅做为于HTTP/1.0的向后兼容而使用。虽然它是一个通用首部,可是它在响应报文中时的行为没有规范,依赖于浏览器的实现。RFC中该字段只有no-cache一个可选值,会通知浏览器不直接使用缓存,要求向服务器发请求校验新鲜度。由于它优先级最高,当存在时必定不会命中强缓存。bash
**2.Cache-Control **服务器
Cache-Control是一个通用首部字段,也是HTTP/1.1控制浏览器缓存的主流字段。和浏览器缓存相关的是以下几个响应指令:网络
max-age(单位为s)设置缓存的存在时间,相对于发送请求的时间。只有响应报文首部设置Cache-Control为非0的max-age或者设置了大于请求日期的Expires(下文会讲)才有可能命中强缓存。当知足这个条件,同时响应报文首部中Cache-Control不存在no-cache、no-store且请求报文首部不存在Pragma字段,才会真正命中强缓存。如下全部图片均为刷新(command+R)的截图。spa
no-cache 表示请求必须先与服务器确认缓存的有效性,若是有效才能使用缓存(协商缓存),不管是响应报文首部仍是请求报文首部出现这个字段均必定不会命中强缓存。Chrome硬性从新加载(Command+shift+R)会在请求的首部加上Pragma:no-cache和Cache-Control:no-cache。code
no-store 表示禁止浏览器以及全部中间缓存存储任何版本的返回响应,必定不会出现强缓存和协商缓存,适合我的隐私数据或者经济类数据。
public 代表响应能够被浏览器、CDN等等缓存。
private 响应只做为私有的缓存,不能被CDN等缓存。若是要求HTTP认证,响应会自动设置为private。
**1.Last-Modified/If-Modified-Since **
If-Modified-Since是一个请求首部字段,而且只能用在GET或者HEAD请求中。Last-Modified是一个响应首部字段,包含服务器认定的资源做出修改的日期及时间。当带着If-Modified-Since头访问服务器请求资源时,服务器会检查Last-Modified,若是Last-Modified的时间早于或等于If-Modified-Since则会返回一个不带主体的304响应,不然将从新返回资源。
If-Modified-Since: , :: GMT
Last-Modified: , :: GMT
复制代码
2.ETag/If-None-Match
ETag是一个响应首部字段,它是根据实体内容生成的一段hash字符串,标识资源的状态,由服务端产生。If-None-Match是一个条件式的请求首部。若是请求资源时在请求首部加上这个字段,值为以前服务器端返回的资源上的ETag,则当且仅当服务器上没有任何资源的ETag属性值与这个首部中列出的时候,服务器才会返回带有所请求资源实体的200响应,不然服务器会返回不带实体的304响应。ETag优先级比Last-Modified高,同时存在时会以ETag为准。
If-None-Match:
If-None-Match: , , …
If-None-Match: *
复制代码