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 值来定义新的文件名,就可以规避缓存。