1395 字
7 分钟
HTTP 缓存完全指南:缓存类型与控制指令
本文整理自 MDN 官方文档《HTTP 缓存》,梳理缓存的类型、控制指令与最佳实践。
一、HTTP 缓存是什么
HTTP 缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。
可复用性有几个优点:
- 响应速度更快——不需要将请求传递到源服务器,客户端和缓存越近,响应速度就越快(最典型的例子是浏览器本身为浏览器请求存储缓存)
- 降低服务器负载——当响应可复用时,源服务器不需要处理请求,因为它不需要解析和路由请求、根据 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 OKContent-Type: text/htmlContent-Length: 1024Date: Tue, 22 Feb 2022 22:22:22 GMTLast-Modified: Tue, 22 Feb 2021 22:22:22 GMT
<!doctype html>…三、不使用缓存
- no-cache 指令不会阻止响应的存储,而是阻止在没有重新验证的情况下重用响应
- no-store 指令:如果不希望响应被存储在任何缓存中,请使用 no-store
Cache-Control: no-store一般来说,实践中”不缓存”的原因通常满足以下情况:
- 出于隐私原因——不希望特定客户以外的任何人存储响应
- 希望始终提供最新信息
- 不知道在过时的实现中会发生什么
1. 不与其他用户共享
如果具有个性化内容的响应意外地对缓存的其他用户可见,那将是有问题的。在这种情况下,使用 private 指令将导致个性化响应仅与特定客户端一起存储,而不会泄露给缓存的任何其他用户。
Cache-Control: private2. 每次都提供最新的内容
- no-store 指令阻止存储响应,但不会删除相同 URL 的任何已存储响应——如果已经为特定 URL 存储了旧响应,返回 no-store 不会阻止旧响应被重用
- no-cache 指令会强制客户端在重用任何存储的响应之前发送验证请求
Cache-Control: no-cache3. 兼容过时的实现
作为忽略 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/分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
最后更新于 ,距今已过 159 天
部分内容可能已过时