好的!下面我给你详细讲解 HTTP 缓存的知识,包括缓存的原理、相关头部字段及其应用场景,帮助你全面理解浏览器和 CDN 的缓存机制。
HTTP 缓存的核心目的是:
客户端请求资源
如果本地有缓存,判断是否有效
服务器根据请求头决定是否返回新内容或 304 状态
更新缓存或直接使用缓存
| 头部名称 | 请求/响应 | 说明 |
|---|---|---|
Cache-Control |
请求和响应 | 现代缓存控制策略的核心 |
Expires |
响应 | 资源过期的具体时间(HTTP/1.0) |
Last-Modified |
响应 | 资源最后修改时间 |
If-Modified-Since |
请求 | 用于条件请求,询问资源是否被修改 |
ETag |
响应 | 资源的唯一标识符(类似指纹) |
If-None-Match |
请求 | 用于条件请求,带上客户端的 ETag |
Cache-Control
是最重要的缓存头,支持多种指令,典型示例:
Cache-Control: public, max-age=3600, must-revalidate
public:表示资源可被任何缓存区缓存(包括
CDN、浏览器等)private:只允许浏览器缓存,不允许 CDN 或代理缓存max-age=秒数:缓存有效的最大时间no-cache:缓存前必须向服务器验证(需条件请求)no-store:不缓存,所有请求都走网络must-revalidate:过期后必须验证缓存有效性Expires: Wed, 21 Oct 2025 07:28:00 GMTCache-Control: max-ageLast-Modified:服务器告诉客户端资源最后修改时间If-Modified-Since
询问资源是否改动304 Not Modified,客户端继续用缓存ETag 是资源的唯一标识(如文件哈希或版本号)If-None-Match 请求,如果 ETag 未变,服务器返回
304| 缓存类型 | 说明 |
|---|---|
| 浏览器缓存 | 浏览器本地保存,减少网络请求 |
| CDN 缓存 | 靠近用户的边缘节点缓存内容 |
| 代理服务器缓存 | ISP 或企业代理缓存,减少跨网流量 |
| 服务端缓存 | 服务器端对动态内容缓存优化 |
Cache-Control: public, max-age=31536000
并配合文件名指纹(hash)实现缓存更新no-cache, must-revalidate 保证实时性| 头部名称 | 说明 |
|---|---|
Vary |
告诉缓存服务器基于哪些请求头区分缓存版本(如
Vary: Accept-Encoding) |
Pragma: no-cache |
旧版 HTTP/1.0 用来禁止缓存 |
Age |
缓存数据在缓存服务器的存活时间 |
Warning |
缓存警告信息 |
客户端请求资源
│
├─ 有缓存?─ 否 ──> 向服务器请求资源
│ │
│ ├─ 服务器返回 200 + 缓存头,客户端缓存
│ └─
└─ 是 ──> 检查缓存是否过期
│
├─ 未过期 ──> 直接使用缓存
└─ 过期 ──> 条件请求 (If-Modified-Since/If-None-Match)
│
├─ 服务器返回 304,客户端继续用缓存
└─ 服务器返回 200,新资源更新缓存
HTTP 缓存机制通过**强制缓存(Cache-Control、Expires)与协商缓存(ETag、Last-Modified)**配合,极大地减少了网络请求和数据传输,是提升性能与用户体验的重要利器。