1395 字
7 分钟
HTTP 缓存完全指南:缓存类型与控制指令

本文整理自 MDN 官方文档《HTTP 缓存》,梳理缓存的类型、控制指令与最佳实践。

一、HTTP 缓存是什么#

HTTP 缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。

可复用性有几个优点:

  1. 响应速度更快——不需要将请求传递到源服务器,客户端和缓存越近,响应速度就越快(最典型的例子是浏览器本身为浏览器请求存储缓存)
  2. 降低服务器负载——当响应可复用时,源服务器不需要处理请求,因为它不需要解析和路由请求、根据 Cookie 恢复会话、查询数据库以获取结果或渲染模板引擎

二、不同种类的缓存#

在 HTTP Caching 标准中,有两种不同类型的缓存:私有缓存共享缓存

1. 私有缓存#

私有缓存是绑定到特定客户端的缓存——通常是浏览器缓存。由于存储的响应不与其他客户端共享,因此私有缓存可以存储该用户的个性化响应

  • 个性化内容通常由 Cookie 控制,但 Cookie 的存在并不能表明响应是私有的,单独的 Cookie 不会使响应成为私有的
  • 如果响应具有 Authorization 标头,则不能将其存储在私有缓存(或共享缓存,除非 Cache-Control 指定的是 public)中

2. 共享缓存#

共享缓存位于客户端和服务器之间,可以存储能在用户之间共享的响应。共享缓存可以进一步细分为代理缓存托管缓存

代理缓存

  • 除了访问控制的功能外,一些代理还实现了缓存以减少网络流量
  • 这通常不由服务开发人员管理,因此必须由恰当的 HTTP 标头等控制
  • 近年来随着 HTTPS 越来越普及,客户端/服务器通信变得加密,在许多情况下,路径中的代理缓存只能传输响应而不能充当缓存,因此无需担心过时代理缓存的实现(甚至无法看到它们)

托管缓存

  • 托管缓存由服务开发人员明确部署,以降低源服务器负载并有效地交付内容
  • 示例包括反向代理、CDN 以及 service worker 与缓存 API 的组合

3. 启发式缓存#

HTTP 旨在尽可能多地缓存,因此即使没有给出 Cache-Control,如果满足某些条件,响应也会被存储和重用,这称为启发式缓存

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
Last-Modified: Tue, 22 Feb 2021 22:22:22 GMT
<!doctype html>

三、不使用缓存#

  • no-cache 指令不会阻止响应的存储,而是阻止在没有重新验证的情况下重用响应
  • no-store 指令:如果不希望响应被存储在任何缓存中,请使用 no-store
Cache-Control: no-store

一般来说,实践中”不缓存”的原因通常满足以下情况:

  1. 出于隐私原因——不希望特定客户以外的任何人存储响应
  2. 希望始终提供最新信息
  3. 不知道在过时的实现中会发生什么

1. 不与其他用户共享#

如果具有个性化内容的响应意外地对缓存的其他用户可见,那将是有问题的。在这种情况下,使用 private 指令将导致个性化响应仅与特定客户端一起存储,而不会泄露给缓存的任何其他用户。

Cache-Control: private

2. 每次都提供最新的内容#

  • no-store 指令阻止存储响应,但不会删除相同 URL 的任何已存储响应——如果已经为特定 URL 存储了旧响应,返回 no-store 不会阻止旧响应被重用
  • no-cache 指令会强制客户端在重用任何存储的响应之前发送验证请求
Cache-Control: no-cache

3. 兼容过时的实现#

作为忽略 no-store 的过时实现的解决方法,你可能会看到使用了诸如以下的 kitchen-sink(大杂烩)标头

Cache-Control: no-store, no-cache, max-age=0, must-revalidate, proxy-revalidate

如果你关心的是共享缓存,可以通过添加 private 来防止意外缓存:

Cache-Control: no-cache, private

总结:Cache-Control 指令速查表#

指令含义
public响应可以被任何缓存存储
private仅私有缓存(浏览器)可存储个性化响应
no-store禁止存储响应
no-cache可存储,但重用前必须重新验证
max-age指定缓存有效期
must-revalidate缓存过期后必须重新验证
proxy-revalidate同上,针对共享缓存

资料来源:MDN — HTTP 缓存

HTTP 缓存完全指南:缓存类型与控制指令
https://www.choria.top/posts/http-storage/
作者
乔瑞雅·克林威尔
发布于
2026-04-05
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

最后更新于 ,距今已过 159

部分内容可能已过时