强缓存和协商缓存的区别
| 类型 | 是否发请求 | 控制字段 |
|---|---|---|
| 强缓存 | ❌ 不发请求 | Cache-Control / Expires |
| 协商缓存 | ✅ 发请求(带验证头) | ETag / Last-Modified |
一、强缓存(Strong Cache)
1️⃣ 定义
浏览器直接使用本地缓存,不向服务器发送请求。
2️⃣ 控制字段
✅ Cache-Control(HTTP/1.1,推荐)
http
Cache-Control: max-age=3600含义:
资源在 3600 秒内直接使用本地缓存
常见指令:
| 指令 | 含义 |
|---|---|
| max-age=秒 | 有效时间 |
| private | 仅浏览器可缓存 |
| no-store | 完全不缓存 |
| public | 所有缓存可用 |
| no-cache | 必须走协商缓存 |
✅ Expires(HTTP/1.0,已过时)
http
Expires: Wed, 21 Oct 2026 07:28:00 GMT问题:
- 依赖客户端时间
- 优先级低于 Cache-Control
3️⃣ 强缓存流程
text
第一次请求 → 服务器返回 max-age=3600
第二次请求(3600秒内) → 浏览器直接用缓存服务器完全不知道这次访问。
二、协商缓存(Negotiation Cache)
1️⃣ 定义
浏览器会发请求,但带验证字段。
服务器返回:
- 304 → 资源没变,用缓存
- 200 → 资源变了,返回新内容
2️⃣ 两种验证机制
🔹 1)Last-Modified + If-Modified-Since
浏览器再次请求:
http
If-Modified-Since: Mon, 24 Feb 2026 10:00:00 GMT服务器返回:
http
Last-Modified: Mon, 24 Feb 2026 10:00:00 GMT服务器判断文件是否修改:
- 没改 → 304
- 改了 → 200
缺点
- 精度是秒
- 文件内容没变但时间变了也会失效
🔹 2)ETag + If-None-Match(更精确)
浏览器请求:
http
If-None-Match: "abc123"服务器返回:
http
ETag: "abc123"服务器对比 hash:
- 相同 → 304
- 不同 → 200
优点
- 精确到内容
- 不受时间影响
缺点
- 服务器要计算 hash
- 分布式部署要注意一致性