不止一叶代码屋 个人技术博客 · 代码与生活的记录

后端开发

HTTP 缓存到底怎么配才不踩坑

四个头字段先分清

  • Cache-Control:最重要,决定缓存多久、谁能缓存
  • Expires:老字段,现在基本被 Cache-Control 覆盖
  • ETag:内容指纹,用于协商缓存
  • Last-Modified:最后修改时间,精度只到秒

强缓存 vs 协商缓存

强缓存:在有效期内,浏览器直接用本地副本,不发请求。 协商缓存:每次发请求,服务器返回 304 或 200。

Cache-Control: max-age=31536000, immutable

immutable 是给「文件名带哈希」的静态资源用的 —— 告诉浏览器这一年里连刷新都不用重新验证。

常见错误配置

错误一:HTML 也设长缓存

Cache-Control: max-age=86400   # HTML 千万别这么写

结果就是发版后用户还在看旧页面。HTML 应该是:

Cache-Control: no-cache

注意 no-cache 不是「不缓存」,是「用之前必须验证」。真要完全不缓存才用 no-store。

错误二:API 响应被 CDN 缓存

带用户信息的接口如果没设 private,可能被 CDN 缓存后返回给别的用户。

Cache-Control: private, no-store

我的默认模板

资源 Cache-Control
HTML no-cache
JS/CSS(带哈希) max-age=31536000, immutable
图片(不带哈希) max-age=86400
用户相关 API private, no-store

小结

缓存配置的核心就一句话:能长期不变的资源才给长缓存,会变的资源交给协商缓存。想清楚这一点,大部分坑都能绕开。

订阅 RSS

← 返回首页