HTTP缓存怎么用才不踩坑:强缓存与协商缓存配合实战

举报
yd_279578268 发表于 2026/10/26 06:06:24 2026/10/26
【摘要】 打开一个网页很快,第二次打开更快,往往不是网络变好了,而是缓存起了作用。缓存用得好,能省带宽、降延迟;用得不好,最常见的就是:明明已经上线了新版本,用户看到的还是旧页面。下面把强缓存和协商缓存讲清楚,再给一套可以直接照抄的搭配方法。一、浏览器缓存的是什么浏览器第一次请求图片、样式、脚本等资源时,会把响应和它的缓存规则一起存下来。下一次再请求同一个地址,浏览器先看本地有没有、过期没有,而不是每...

打开一个网页很快,第二次打开更快,往往不是网络变好了,而是缓存起了作用。缓存用得好,能省带宽、降延迟;用得不好,最常见的就是:明明已经上线了新版本,用户看到的还是旧页面。下面把强缓存和协商缓存讲清楚,再给一套可以直接照抄的搭配方法。


一、浏览器缓存的是什么


浏览器第一次请求图片、样式、脚本等资源时,会把响应和它的缓存规则一起存下来。下一次再请求同一个地址,浏览器先看本地有没有、过期没有,而不是每次都去问服务器。注意这里的判断依据是地址加缓存头,不是文件名看起来像不像。改了内容却不改地址,又不给合理的缓存时间,就很容易出现旧版本阴魂不散。


二、强缓存:不发请求,直接用本地的


强缓存由 Cache-Control 控制,常见写法是 max-age=31536000,表示一年内直接用本地副本,不用再请求服务器。Expires 是老写法,用的是绝对时间,容易受客户端时钟影响,现在一般只用 Cache-Control 就够了。强缓存适合内容基本不变、而且文件名带哈希的静态资源,例如 app.9f3c.js。文件名一变,地址就变,旧缓存自然失效,不用担心用户拿到旧文件。


三、协商缓存:先问服务器,有没有变


如果强缓存过期,或者响应头写了 no-cache,浏览器会带着条件去问服务器。Last-Modified 对应 If-Modified-Since,是按最后修改时间判断;ETag 对应 If-None-Match,是按内容指纹判断。服务器发现没变,返回 304,不带正文,省流量;发现变了,返回 200 和新内容。ETag 更精确,能识别一秒内多次修改、内容回滚等时间戳看不出来的变化,所以关键资源优先用 ETag。


四、推荐搭配:入口和静态资源分开对待


最稳妥的分工是:HTML 入口文件不做强缓存,或者只给很短的 max-age,让浏览器每次都去协商确认;图片、样式、脚本等静态资源用长 max-age 加内容哈希。这样既保证新版本能及时到达用户,又让不常变的文件一次下载、长期复用。发布时只改入口引用的哈希文件名,旧文件可以继续被缓存,不会互相干扰。


五、排查时先看这三点


第一,看响应头到底写了什么,不要凭感觉猜缓存时间;第二,看状态码是 200 还是 304,确认走的是强缓存、协商缓存还是根本没缓存;第三,确认是不是 CDN 或代理层又加了一层缓存,源站改了,边缘节点还没回源。本地调试时可以用无痕窗口或禁用缓存,避免被自己的缓存误导。


缓存不是越久越好,也不是越短越安全。把入口文件做短、把带哈希的静态文件做长,再用 ETag 兜底一次变化判断,多数线上旧版本问题都能提前避免。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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