HTTP 缓存请求头

Cache-Control

请求/响应头,缓存控制字段。HTTP 缓存的最高控制指令,优先级最高。

  • no-store:所有内容都不缓存。
  • no-cache:缓存,但是浏览器使用缓存前,都会请求服务,判断缓存资源是否是最新的、有效的。
  • max-age=x(秒):请求缓存后 x 秒不在发起请求,http1.1 属性,优先级高于Expires。
  • s-maxage=x(秒):代理服务器请求源站缓存后 x 秒不在发起请求,只对 CDN 有效。
  • public : 客户端和服务器代理都可以缓存。
  • private: 只有客户端可以缓存。

Expires

响应头,缓存过期时间,由服务器提供,GTM 日期格式,http1.0 的属性,在于 max-age(http1.1)共存的情况下,max-age 优先级更高。

expires 与 max-age 的主要区别在于 max-age 提供的是一个时间差,而 expires 提供的则是一个到期时间,由服务器提供,但是判断都是在浏览器端进行的。

Last-Modified

响应头,资源最后修改时间,由服务器告诉浏览器。

If-Modified-Since

请求头,资源最后修改时间,即上一次的 Last-Modified 值。

Etag

响应头,资源标示,由服务器告诉浏览器。

If-None-Match

请求头,资源表示,即上一次的 Etag。

使用HTTP缓存

HTTP 缓存的使用具体有一下几种场景:

仅使用 Express 设置过期时间

这个判断过程发生在客户端。

如果 Expires 时间已经到了,文件并没有修改,那么如何避免不必要的请求呢?

在过期时间的基础上,再加一个最后一次修改文件的时间 Last-Modified

由于浏览器端可以随意修改Expires,Expires不稳定,Last-Modified只能精确到秒,极端情况下可能会出现拿不到最新文件的情况。

在加一个 Etag 文件表示来判断文件的有效性

由于Match 的精确度足够高,此时虽然客户端携带了 If-Modified-Since ,服务器也不需要再做对比。

具体的缓存使用场景

强缓存&协商缓存

强缓存:当使用expires 或者 max-age 失效时,即直接使用本地缓存,不会发起请求的情况下,触发的都是强缓存。

协商缓存:当使用 Cache-Control:no-cache 时,触发的都是协商缓存。

操作对缓存使用的影响

操作 express/cache-control Last-Modified/Match
地址回车/链接跳转/新窗口/前进后退 有效 有效
F5 刷新 无效 有效
Ctrl+F5 刷新 无效 无效

避免使用缓存的方案

hash 缓存/md5 缓存

即通过 hash 值或者 md5 值来定义新的文件名,就可以规避缓存。