浏览器端的缓存可以分为强制缓存
和对比缓存
强制缓存
如果是强制缓存,浏览器会直接读取浏览器本地存储的缓存。
如果未失效,则直接使用缓存数据。
如果缓存失效,则会请求服务器端,服务器端返回缓存规则和数据。
对比缓存
如果是对比缓存,浏览器首先回去服务器端验证该缓存是否失效。
如果未失效,则通知浏览器该资源未失效。
如果已失效,则返回给浏览器最新的数据和缓存规则。并且将缓存规则和最新的数据写入浏览器本地缓存
强制缓存规则
服务器端会返回两个字段Expires(HTTP1.0)
和Cache-Control(HTTP1.1)
两个字段来控制强制缓存
由于客户端的时间不太可控,因此在HTTP1.1中,新增了Cache-Control
,该字段可以直接设置资源的缓存时间max-age
。这样一来,资源的缓存期可以使用服务器端的时间了。
对比缓存规则
对比缓存存在两套规则
第一种:ETag/If-None-Match
这套规则的优先级会高于下面介绍的第二种规则
在第一次服务器端返回一个资源时,在响应头信息里面会包含一个ETag
的字段,该字段有服务器端生成。
下一次浏览器端判断这个资源是不是过期时,会带上一个If-Modifed-Since
的信息,该信息就是上一次的ETag信息。用于验证这个资源是不是过期。
如果相同,则返回304的状态码
如果不同,则返回200的状态码以及最新的资源
第二种:Last-Modified/If-Modified-Since
,本套规则的优先级低于第一套
在第一次返回一个资源时,响应头信息里面会包含一个Last-Modifed
的字段,该字段有服务器端生成,标识了该资源的上一次修改时间
浏览器端再次请求时,会带上一个If-Modifed-Since
的字段,该信息就是Last-Modifed
的时间
如果资源的最后修改时间大于If-Modifed-Since
,就返回200和最新的资源
如果资源的最后修改时间小于If-Modifed-Since
,就返回304,浏览器继续使用本地缓存