HTTP 缓存
什么是HTTP缓存
http缓存指的是: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。
常见的http缓存只能缓存get请求响应的资源,对于其他类型的响应则无能为力,所以后续说的请求缓存都是指GET请求。
http缓存都是从第二次请求开始的。第一次请求资源时,服务器返回资源,并在respone header头中回传资源的缓存参数;第二次请求时,浏览器判断这些请求参数,命中强缓存就直接200,否则就把请求参数加到request header头中传给服务器,看是否命中协商缓存,命中则返回304,否则服务器会返回新的资源。
http缓存的分类
根据是否需要重新向服务器发起请求来分类,可分为:强制缓存、协商缓存。
根据是否被单个或多个用户使用来分类,可分为:私有缓存,共享缓存。
强制缓存如果生效,不需要在和服务器发生交互
强缓存
在响应头中expires/Cache-Control这两个字段会标明失效规则,若其都为失效,会直接使用浏览器缓存数据。
- Expires:http1.0标准中字段,值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。
- Cache-Control:http1.1中新增字段,常见取值有private、public、no-cache、max-age、no-store,默认为private
协商缓存
是服务器通过资源标识来判断是否使用缓存。 当第一次请求服务器返回的响应头中没有Cache-Control和Expires或者Cache-Control和Expires过期、Cache-Control设置为no-cache,那么浏览器在下一次请求时就会与服务器进行协商。
相关的请求头字段:ETag(一般为文件hash)/If-None-Match、 Last-Modified/If-Modified-Since
其中ETag/If-None-Match优先级高于Last-Modified/If-Modified-Since
大致流程如下图: