HTTP
的缓存属于客户端缓存,因此咱们能够认为浏览器存在一个缓存数据库,用于储存一些不常常变化的静态文件(图片、css、js
等)。能够将缓存分为强制缓存和协商缓存。css
能够理解为无须验证的缓存策略。对强缓存来讲,响应头中有两个字段 Expires/Cache-Control
来代表规则。web
当缓存数据库中已有所请求的数据时。客户端直接从缓存数据库中获取数据。当缓存数据库中没有所请求的数据时,客户端的才会从服务端获取数据。算法
Expires
的值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。 不过Expires
是HTTP 1.0
的东西,如今默认浏览器均默认使用HTTP 1.1
,因此它的做用基本忽略。 另外一个问题是,到期时间是由服务端生成的,可是客户端时间可能跟服务端时间有偏差,这就会致使缓存命中的偏差。 因此HTTP 1.1
的版本,使用Cache-Control
替代。数据库
Cache-Control
有不少属性,不一样的属性表明的意义也不一样。浏览器
private
:客户端能够缓存public
:客户端和代理服务器均可以缓存max-age=t
:指定一个时间长度,在这个时间段内缓存是有效的,单位是s.no-cache
: 告诉浏览器、缓存服务器,无论本地副本是否过时,使用资源副本前,必定要到源服务器进行副本有效性校验。must-revalidate
:告诉浏览器、缓存服务器,本地副本过时前,能够使用本地副本;本地副本一旦过时,必须去源服务器进行有效性校验。no-store
:禁止缓存,每次请求都要向服务器从新获取数据。又称对比缓存,客户端会先从缓存数据库中获取到一个缓存数据的标识,获得标识后请求服务端验证是否失效,若是没有失效服务端会返回304,此时客户端直接从缓存中获取所请求的数据,若是标识失效,服务端会返回更新后的数据。缓存
Last-modified
: 服务器端资源的最后修改时间,响应头部会带上这个标识。第一次请求以后,浏览器记录这个时间,再次请求时,请求头部带上 If-Modified-Since
即为以前记录下的时间。服务器端收到带 If-Modified-Since
的请求后会去和资源的最后修改时间对比。若修改过就返回最新资源,状态码 200
,若没有修改过则返回 304
。服务器
由服务器端上生成的一段 hash
字符串,第一次请求时响应头带上 ETag: abcd
,以后的请求中带上 If-None-Match: abcd
,服务器检查 ETag
,返回 304
或 200
。google
可是实际应用中因为Etag
的计算是使用算法来得出的,而算法会占用服务端计算的资源,全部服务端的资源都是宝贵的,因此就不多使用Etag
了。代理
关于 last-modified
和 Etag
区别,已经有不少人总结过了:code
Last-modified
只能精确到秒。Last-modified
看不出内容没有改变。Etag
的精度比 Last-modified
高,属于强验证,要求资源字节级别的一致,优先级高。若是服务器端有提供 ETag 的话,必须先对 ETag 进行 Conditional Request。