STATUS IS UP网站优化 Wiki
20加速
性能与交付 / 加速

网站所有者的浏览器缓存指南

制定明确的 HTTP 缓存规则,使重复访问避免不必要的下载,同时不把访客困在旧页面或不安全的个性化内容上。

网站所有者的浏览器缓存指南 — 可视化指南
阅读
7 分钟
来源
6
重新验证
2027-03-27
已审阅
Web 性能与发布工程审阅者
简短回答

从决策开始。

为每类 URL 使用不同的缓存规则。对在该 URL 下内容不会变化的文件(例如带哈希的 JavaScript、CSS、字体和图片)给予较长的有效期;对 HTML 和其它未版本化的响应,当新鲜度重要时,应使用在重用前进行验证的策略。只要资源发生变化就发布新的资源 URL;对仍处于新鲜期的副本,长期缓存生命周期无法可靠地撤销。

从显式的 Cache-Control 头开始,然后在预发布(staging)环境中验证头部和浏览器行为。将适于验证的响应与 ETag 和(可用时)Last-Modified 配对。将个性化、账户、结账和敏感响应与公共页面区分处理。SIU 将这项工作作为主动的可用性优化:它减少可避免的源站工作并在缓存相关的发布缺陷影响可用网站之前予以阻止。

可视化指南

把工作看作一个系统。

使用此地图在执行具体策略前将文章中的决策联系起来。

SIU加速
01按资源映射策略,而非按服务器
02精确使用 Cache-Control 术语
03在赋予长生命周期前先版本化不可变资产
04让 HTML 通过验证保持最新,而不是长期缓存
01

按资源映射策略,而非按服务器

在更改头部之前清点具有代表性的 URL:主页、内容页、应用壳、CSS、JavaScript、图片、字体、API、登录、账户、结账和下载。对每个 URL 记录该响应是公共还是个性化、其 URL 在字节变化时是否会变化,以及修正需要多快到达访客。

根据该清单制作策略矩阵。公共的、基于内容地址(content-addressed)的资产需要与稳定地址上的 HTML 不同的规则。没有 Cache-Control 的响应仍可能被启发式缓存,因此明确规则更容易测试。

新鲜期(Freshness lifetime)

存储的响应可重用的时段;max-age 以秒为单位指定该时长。

02

精确使用 Cache-Control 术语

Cache-Control 告诉浏览器和共享缓存如何存储与重用响应。max-age=N 在资源“新鲜”时允许重用。s-maxage=N 设置共享缓存的新鲜期并在共享缓存中覆盖 max-age,但浏览器会忽略 s-maxage。public 允许任何缓存存储;private 允许浏览器缓存但阻止共享缓存存储。

no-cache 允许存储但在重用前要求向源站验证。no-store 表示缓存不得存储该响应,但它并非完整的隐私控制。当过期后不能接受返回过期内容时,请使用 must-revalidate;这样在源站不可用时可以返回 504 而不是过期的备选内容。

避免一刀切的 no-store

no-store 是移除存储而不是仅要求检查;仅对确实不得存储的响应使用它。

03

在赋予长生命周期前先版本化不可变资产

版本化的资产 URL 包含内容指纹或发布版本,例如 app.4f2c.js。当资产字节变化时,发布不同的 URL 并更新 HTML 引用。缓存会看到新资源,因此访客在不需要对每个浏览器发出失效通知的情况下获取新资产。

对于在其新鲜期内不会变化的表示,Cache-Control: max-age=31536000, immutable 是一种实用模式。immutable 告诉支持它的客户端在资源仍“新鲜”时不要进行条件重验证。不要将它或一年期的 max-age 应用于可变且同一 URL 的文件。在被缓存的 HTML 可能仍引用它们的情况下,应保留先前的指纹化资产。

HTML 是清单(manifest)

HTML 决定资源 URL,因此发布顺序必须保留被引用的生成版本。

04

让 HTML 通过验证保持最新,而不是长期缓存

HTML 通常有稳定的、面向人的 URL,并会随着内容、资源引用、功能开关或安全公告而变化。一种保守的公共 HTML 模式是使用 Cache-Control: no-cache,并配合 ETag 和 Last-Modified(当平台能正确生成时)。浏览器会存储主体,但在重用前发出条件请求;未改变的响应可返回 304 Not Modified 而无主体。

ETag 标识资源版本。对于过期的响应,浏览器可以在 If-None-Match 中发送该 ETag;如果匹配,服务器回复 304,否则发送新的表示。RFC 指南建议在可能的情况下在 200 响应上同时提供 ETag 和 Last-Modified。no-cache 并不保证在后退(Back)或前进(Forward)导航时一定会进行验证,因为浏览器可能恢复会话历史的快照。

验证器质量

ETag 必须在表示变化时改变;在不同源与部署间测试其行为。

05

将公共交付与个性化和敏感响应分离

共享缓存(例如 CDN)可能会为多个用户重用同一响应。不要让它在用户间重用账户特定的 HTML 或 API 数据。对于可能保存在浏览器的个性化内容,private, no-cache 是合理的起点:它阻止共享存储并要求验证。单独的 Set-Cookie 头并不能阻止缓存。

对于不应被存储的响应,请使用 no-store,并审查应用代码、CDN 规则、service worker、浏览器存储、日志和错误页。仅靠头部并不能构成隐私、合规或支付安全计划。应由合格的安全、隐私和支付审查人员评估敏感流程与适用要求。

授权变更

在热缓存的浏览器和 CDN 下测试登录、登出、账户切换和权限变更。

06

将缓存更改作为可逆发布逐步推出

捕获未缓存与重复请求的基线头部和主体行为。在预发布环境中,先部署版本化资产,再部署引用它们的 HTML,并测试旧的已缓存 HTML 与新源站之间的兼容性。检查直接源站和 CDN 路径(如果两者都存在)。DevTools Network headers 应显示预期的策略和重复访问行为。

保留发布清单,记录资产 URL、头部规则和配置版本。如果一次发布包含不兼容的客户端文件,恢复兼容的 HTML 与应用行为,但不要覆盖已发布的指纹化文件。将 HTML 指向已知的良好生成版本,并在被缓存的 HTML 可能请求它们时同时保留两代资源。共享缓存的清除不能强制浏览器丢弃仍然“新鲜”的响应。

主动修复

将头部测试失败、资产 404 与版本不匹配转化为下一次发布清单中的变更项。

行动 / 验证

你的实用待办指南。

  1. 01

    清点响应类别

    将示例 URL 分类为公共或个性化、可变或已版本化。

    验证: 包括 HTML、资产、API、认证、账户、结账和错误页面。
  2. 02

    捕获当前头部

    记录源站与 CDN 的 Cache-Control、ETag、Last-Modified、Age、Vary 与状态码。

    验证: 每个示例都有更改前的快照。
  3. 03

    对可变资产做指纹化

    让构建过程在字节变化时发布新的资源 URL。

    验证: 变更的资产会生成不同的 URL 并更新 HTML 引用。
  4. 04

    设置显式策略

    仅对不可变的版本化 URL 使用长期规则;对稳定 URL 使用以验证为先的规则。

    验证: 头部测试与预期策略匹配。
  5. 05

    测试验证流程

    检查未改变的文档在条件请求后返回 304,而改变的返回带有新 ETag 的 200。

    验证: 预发布跟踪显示这两条路径。
  6. 06

    演练隐私边界

    在热缓存下测试两个账户、登出、角色变更与敏感路由。

    验证: 无个性化响应在用户间交叉。
  7. 07

    证明发布兼容性

    在下一个发布后加载缓存的旧 HTML。

    验证: 旧版与当前 HTML 能加载其引用的资产且无 404 或脚本错误。
  8. 08

    记录回滚方案

    记录良好生成版本、头部版本、负责人及旧资产保留期。

    验证: 非生产演练能在不编辑不可变 URL 的情况下恢复已知良好代。
讨论主题

比较各种权衡,而不是私有数据。

与团队或网站所有者社区一起使用这些提示。共享方法与经验,但切勿粘贴凭证、客户记录或非公开的基础设施细节。

  1. 01

    贵站点中哪些 URL 类别最难被分类为公共、个性化、不可变或频繁变化?你如何记录该决策?

  2. 02

    哪一种发布顺序测试在抓住旧 HTML 与新资产不匹配方面最有用,从而在访客遇到问题前发现?

  3. 03

    你的 CDN、应用与浏览器缓存规则在哪里重叠,谁负责验证它们组合后的行为与预期策略一致?

热门 / 权威资源

打开来源材料。

IETFRFC 9111: HTTP Caching ↗

解释新鲜度、验证、缓存指令、失效(invalidation)和敏感信息的限制。

已审阅 2026-09-27
IETFRFC 8246: HTTP Immutable Responses ↗

定义不可变缓存(immutable)、其适用范围以及损坏(corruption)方面的考虑。

已审阅 2026-09-27
MDN Web DocsHTTP caching ↗

关于验证器、304 响应、个性化与缓存破坏(cache-busting)的实用指南。

已审阅 2026-09-27
MDN Web DocsCache-Control header ↗

关于 max-age、s-maxage、no-cache、no-store、private、public 和 must-revalidate 的参考。

已审阅 2026-09-27
MDN Web DocsETag header ↗

解释实体标签(ETag)、If-None-Match 与 304 验证流程。

已审阅 2026-09-27
web.devPrevent unnecessary network requests with the HTTP Cache ↗

关于版本化 URL、验证器、策略与部署的实务建议。

已审阅 2026-09-27

来源政策。 本文使用已阅读的标准和一手技术文档。它避免不受支持的性能声明,并将 HTTP 规则与平台特定配置分离。

快速说明

常见问题。

no-cache 是否意味着浏览器不能存储页面?

不是。no-cache 允许存储但在重用前要求与源站成功验证。只有在响应确实不应被存储时才使用 no-store,同时要认识到单独的 no-store 并不能构成完整的隐私保障。

每个静态文件都应该设置一年的缓存生命周期吗?

不应该。只有当该 URL 在这段时间内字节不会变化(通常因为 URL 已指纹化或版本化)时,一年期 max-age 才合适。可变的同一 URL 文件需要更短或以验证为先的策略。

CDN 的清除(purge)能够修复浏览器缓存错误吗?

它可以移除托管的共享缓存副本,但不能强制每个浏览器丢弃仍在新鲜期内的响应。应发布新的版本化资产 URL 并更新 HTML 引用;如有需要,使用回滚计划将 HTML 指回兼容的生成版本。

Status Is UP Editorial Team · 上线可用性启用编辑

由 Web 性能与发布工程审阅者 审阅。发布于 2026-09-27;更新于 2026-09-30。