强缓存策略
直接从本地副本比对读取,不去请求服务器,返回的状态码是 200。
cache-control
HTTP1.1
新增了 cache-control
字段,当 cache-control
和 expires
都存在时,cache-control
优先级更高。该字段是一个时间长度,单位秒,表示该资源过了多少秒后失效。当客户端请求资源的时候,发现该资源还在有效时间内则使用该缓存,它不依赖客户端时间。cache-control
主要有 max-age
和 s-maxage
、public
和 private
、no-cache
和 no-store
等值。
// 给返回头Response Headers中设置过期时间,下图中Cache-Control优先级高于Expires
res.setHeader('Cache-Control', 'max-age=20')
我们在10秒后刷新依然在读缓存说明缓存生效而且是以Cache-Control优先的。
协商缓存
上面的 expires
和 cache-control
都会访问本地缓存直接验证看是否过期,如果没过期直接使用本地缓存,并返回 200。但如果设置了 no-cache
和 no-store
则本地缓存会被忽略,会去请求服务器验证资源是否更新,如果没更新才继续使用本地缓存,此时返回的是 304,这就是协商缓存。
协商缓存主要包括 last-modified
和 etag
。
方式一:last-modified & if-Modified-Since
- 静态资源应答时都会通过last-modified来标示修改时间。
- 浏览器下次请求相同资源会将last-modified时间作为if-modified-since字段放在请求报文中用以询问服务器是否该资源过期。
- 服务器需要通过规则判断是否过期
- 过期时直接返回200并在body中放入更新内容
- 如果未过期则直接返回304状态码即可
方式二:etag & if-None-Match
该方法一般的做法是将返回内容进行摘要(Hash),然后通过对比摘要来判断内容是否更新。
- 静态资源应答时都会通过etag来标示内容摘要。
- 浏览器下次请求相同资源会将etag作为if-none-match字段放在请求报文中用以询问服务器是否该资源过期。
- 服务器需要通过和服务器内容的摘要进行比对确定是否过期
- 过期时直接返回200并在body中放入更新内容
- 如果未过期则直接返回304状态码即可
以上就是我对HTTP的强缓存与协商缓存的理解,如果文章由于我学识浅薄,导致您发现有严重谬误的地方,请一定在评论中指出,我会在第一时间修正我的文章,以避免误人子弟。