HTTP 缓存分为以下两种,两者都是通过 HTTP 响应头控制缓存。
- 强制缓存
- 协商缓存
强制缓存
再次请求时无需再向服务器发送请求
client server
GET /a.ab389z.js ------->
<------- 200 OK
(再也不会发请求)
与之相关的 Response Headers 有以下几个
-
Expires
这个头部也是丧心病狂:使用绝对时间,且有固定的格式 tools.ietf.org/html/rfc822…
Expires: Mon, 25 Oct 2021 20:11:12 GMT
-
Cache-Control
,具有强大的缓存控制能力常用的有以下两个
no-cache
,每次请求需要校验服务器资源的新鲜度max-age=31536000
,浏览器在一年内都不需要向服务器请求资源
协商缓存
再次请求时,需要向服务器校验新鲜度,如果资源是新鲜的,返回 304,从浏览器获取资源
client server
GET /a.js ----------->
<----------- 200 OK
GET /a.js ----------->
<----------- 304 Not Modified
与之相关的 Request/Response Headers 有以下几个
Last-Modified
/If-Modified-Since
,匹配 Response Header 的Last-Modified
与 Request 的If-Modified-Since
是否一致Etag
/If-None-Match
,匹配 Response Header 的Etag
与 Request 的If-None-Match
是否一致
实例
我在 Apifox 中演示了知名网站关于强缓存与协商缓存的应用。见文档。
作业
- 什么是强缓存和协商缓存
- 协商缓存如何校验新鲜度