HTTP 缓存机制是浏览器和服务端通过特定协议约定资源缓存策略的技术,目的是减少重复请求、提升加载速度。以下是常见的 HTTP 缓存机制及其核心原理:
一、强制缓存(无需向服务端验证)
浏览器直接根据本地缓存判断是否使用缓存资源,无需发送请求到服务端。
1. Cache-Control
(HTTP/1.1 标准)
- 通过响应头设置,常用指令:
max-age=3600
:资源有效期为 3600 秒(优先级高于Expires
)。public
:允许代理服务器和浏览器缓存。private
:仅允许浏览器缓存。no-cache
:需协商缓存验证(不直接使用本地缓存)。no-store
:禁止任何缓存(完全禁用缓存)。immutable
:资源永不变,跳过验证(适合长期静态资源)。
2. Expires
(HTTP/1.0 旧标准)
- 通过响应头设置绝对过期时间(如
Expires: Wed, 21 Oct 2025 07:28:00 GMT
)。 - 缺点:依赖客户端和服务端时间一致,已被
Cache-Control
替代。
二、协商缓存(需向服务端验证)
当强制缓存失效时,浏览器携带验证信息向服务端发起请求,服务端决定是否返回新内容(返回 304 或 200)。
1. Last-Modified
& If-Modified-Since
- 服务端返回
Last-Modified: <时间>
,表示资源最后修改时间。 - 浏览器下次请求时携带
If-Modified-Since: <Last-Modified的值>
。 - 服务端比对时间:
- 未修改 → 返回 304 Not Modified(空 body)。
- 已修改 → 返回 200 和新内容。
2. ETag
& If-None-Match
- 服务端返回
ETag: <唯一标识符>
(如文件哈希值)。 - 浏览器下次请求时携带
If-None-Match: <ETag的值>
。 - 服务端比对标识符:
- 一致 → 返回 304。
- 不一致 → 返回 200 和新内容。
- 优势:比
Last-Modified
更精准(如 1s 内多次修改或内容不变但修改时间变化)。
三、缓存策略组合
1. 强缓存优先 + 协商兜底
Cache-Control: max-age=3600 # 1 小时内强制缓存
ETag: "abc123" # 超时后通过 ETag 验证
2. 禁止缓存
Cache-Control: no-store # 完全不缓存
3. 始终验证
Cache-Control: no-cache # 每次请求都需协商验证
四、缓存位置
- Memory Cache
- 内存缓存,快速读取,页面关闭即失效(适合小文件)。
- Disk Cache
- 磁盘缓存,持久化存储(适合大文件)。
- Service Worker Cache
- 通过 Service Worker 控制的离线缓存(需手动编程管理)。
五、缓存失效与更新
1. 主动更新
- 修改 URL:通过添加哈希或版本号(如
style.v2.css
)。 - 服务端更新
ETag
或Last-Modified
。
2. 被动失效
- 缓存时间到期(
max-age
或Expires
)。
六、最佳实践
- 静态资源(JS/CSS/图片)
- 设置长期强制缓存(如
max-age=31536000
),并通过文件名哈希控制更新。
- 设置长期强制缓存(如
- 动态接口(API)
- 使用
no-cache
或短效max-age
,配合ETag
验证。
- 使用
- 关键路径资源(HTML)
- 禁用缓存或设置短效缓存(如
max-age=300
)。
- 禁用缓存或设置短效缓存(如
总结
- 强制缓存:速度快,但需注意过期策略。
- 协商缓存:保证资源新鲜度,但增加网络请求。
- 组合使用:通过
Cache-Control
和ETag
实现性能与一致性的平衡。