强缓存靠时间有效性直接跳过请求,协商缓存需发请求由服务端比对etag或last-modified后返回304;前者状态码为200(from cache),后者为304,且强缓存无网络交互而协商缓存有完整http往返。

本质区别在于:强缓存靠“时间有效性”直接跳过网络请求,协商缓存靠“服务端确认”仍需发一次请求。
强缓存:真·零请求,靠本地时间判断是否可用
浏览器拿到资源时,服务器在响应头里明确写了“这个资源有效期到什么时候”,比如:
- Cache-Control: max-age=3600 —— 从这次请求开始,1小时内不用再问服务器
- Expires: Wed, 22 Jul 2026 02:03:00 GMT —— 用服务器时间算出的绝对截止点(但已基本被 max-age 取代)
只要当前时间没超这个期限,浏览器连 TCP 连接都不建,直接从磁盘或内存读缓存文件,Network 面板显示 200 (from disk cache) 或 200 (from memory cache)。这才是“秒开”的核心——没有网络往返、没有 DNS、没有 TLS 握手、没有服务器处理。
协商缓存:有请求,但不传数据,靠比对标识决定复用
当强缓存失效(比如 max-age 过了),浏览器会发起一个轻量请求,带上两个关键字段:
- If-None-Match: "abc123" —— 对应服务器之前给的 ETag(资源唯一指纹)
- If-Modified-Since: Wed, 22 Jul 2026 01:00:00 GMT —— 对应服务器之前给的 Last-Modified(最后修改时间)
服务器收到后只做比对:指纹一致 or 时间没变 → 直接返回 304 Not Modified,不带响应体;否则返回 200 和新内容。虽然省了传输体积,但请求本身仍走完整 HTTP 流程,有延迟,不算“秒开”。
为什么强缓存能真正秒开?关键在三个不发生
强缓存命中时,以下三件事完全不会发生:
- 不建立 TCP 连接
- 不发送任何 HTTP 请求报文
- 不等待服务器任何响应
整个过程由浏览器内核在毫秒级完成,和打开本地文件一样快。这也是静态资源(JS/CSS/图片)必须配好 Cache-Control 的原因——不是为了省带宽,是为了消灭请求链路上的所有不确定性延迟。
实际配置建议:优先用 max-age,慎用 no-cache
常见误区是把 Cache-Control: no-cache 当作“禁止缓存”,其实它只是禁用强缓存、强制走协商缓存——页面依然要发一次请求。真想让资源不缓存,该用 no-store;想长期缓存不变资源,设 max-age=31536000(1年)并配合文件哈希命名;HTML 页面通常设 max-age=0, must-revalidate 或 no-cache,确保每次都能拿到最新结构。











