HTTP 缓存要点
浏览器缓存分两层:先看强缓存,没命中或过期了再走协商缓存。
强缓存
由 Cache-Control 决定,命中时浏览器直接用本地副本,连请求都不发。
max-age=秒数:多久之内算新鲜no-cache:可以存,但每次用之前都要问服务器(不是“不缓存”)no-store:完全不存,才是真正的“不缓存”private/public:能不能被 CDN 等中间代理缓存immutable:有效期内连刷新都不重新验证
老的 Expires 头写的是绝对时间,受客户端时钟影响,两者同时存在时以 Cache-Control 为准。
协商缓存
强缓存过期后,浏览器带上验证信息去问服务器,没变就返回 304,不传正文。
| 服务器返回 | 浏览器下次带上 |
|---|---|
ETag | If-None-Match |
Last-Modified | If-Modified-Since |
ETag 更准,Last-Modified 只精确到秒,而且文件内容没变但修改时间变了也会判成变了。
常见配法
- 文件名带内容哈希的静态资源(
app.3f9a1c.js):max-age=31536000, immutable,内容一变文件名就变 - HTML 入口:
no-cache,保证每次都能拿到最新的资源引用 - 带个人数据的接口:
private, no-store
排查
开发者工具 Network 面板里,Size 列显示 (disk cache) 或 (memory cache) 是命中强缓存,状态码 304 是协商缓存命中。勾上 Disable cache 可以临时关掉缓存。