HTTP缓存机制详解:强缓存与协商缓存实战

举报
yd_255989600 发表于 2026/11/11 06:19:03 2026/11/11
【摘要】 引言前端性能优化中,HTTP缓存是最直接、收益最大的手段之一。合理配置缓存策略,可以让用户在二次访问时几乎零网络开销地加载页面资源。本文结合实际排查经验,梳理强缓存与协商缓存的工作机制、常见坑点与排查方法。一、两类缓存的基本分工浏览器缓存分为强缓存与协商缓存两层。强缓存命中时,浏览器完全不发请求,直接从本地读取副本,控制字段是 Cache-Control 与 Expires;协商缓存则是在强...

引言

前端性能优化中,HTTP缓存是最直接、收益最大的手段之一。合理配置缓存策略,可以让用户在二次访问时几乎零网络开销地加载页面资源。本文结合实际排查经验,梳理强缓存与协商缓存的工作机制、常见坑点与排查方法。

一、两类缓存的基本分工

浏览器缓存分为强缓存与协商缓存两层。强缓存命中时,浏览器完全不发请求,直接从本地读取副本,控制字段是 Cache-Control 与 Expires;协商缓存则是在强缓存过期后,浏览器携带标识询问服务器资源是否变更,未变更返回 304,控制字段是 ETag/If-None-Match 与 Last-Modified/If-Modified-Since。

二、Cache-Control 关键指令

max-age 定义副本有效期(秒);no-cache 不是不缓存,而是每次使用前必须协商校验;no-store 才是彻底不落盘;immutable 告诉浏览器资源永不变化,即使强缓存过期也不必发起协商请求,适合带内容哈希文件名的静态资源。

三、ETag 与 Last-Modified 的优先级

服务器同时下发两者时,浏览器校验优先使用 ETag。原因在于 Last-Modified 只能精确到秒,且无法表达"内容回滚"这类逻辑变更;ETag 是内容指纹,变更检测更可靠。实践中若 ETag 生成算法开销大(如全量哈希),可只保留 Last-Modified 换取校验效率。

四、常见坑点与排查思路

坑一:HTML 文件误配长 max-age,导致发版后用户长时间看到旧页面。正确做法是 HTML 用 no-cache,静态资源用带哈希文件名加长 max-age,实现"发版秒级生效 + 资源长缓存"。坑二:Nginx 默认按 mtime 生成 ETag,rsync 同步后 mtime 变化会导致全量缓存失效,可用 etag off 配合自定义缓存头。坑三:CDN 节点回源响应与源站头不一致,排查时要用 curl -I 分别对比源站与边缘节点的响应头。

五、验证方法

DevTools Network 面板中,Size 列显示 disk cache 或 memory cache 即强缓存命中;返回 304 表示协商缓存生效;Disable cache 勾选后可强制绕过缓存验证首次加载。建议每次调整缓存策略后,先用无痕窗口验证,再灰度观察真实用户的命中率曲线。

总结

缓存策略的本质是"变更成本与复用收益"的权衡:变更频繁的用协商缓存兜底,变更可预期的用哈希文件名加长强缓存。掌握这套模式后,绝大多数缓存类问题都能定位到具体环节。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。