HTTP 缓存的目标是减少重复传输,让浏览器和服务器都少做无用功。理解缓存并不需要先记住所有头字段,先分清“强缓存”和“协商缓存”就够了。

强缓存

强缓存命中时,浏览器可以直接使用本地副本,不需要向服务器发请求。常见控制字段是:

1
Cache-Control: max-age=3600

它表示资源在 3600 秒内可以认为是新鲜的。对于带版本号的静态资源,例如 app.abc123.js,可以设置较长缓存时间。

协商缓存

协商缓存会向服务器确认资源是否变化。如果没变化,服务器返回 304 Not Modified,浏览器继续使用本地缓存。

常见字段包括:

  • Last-Modified / If-Modified-Since
  • ETag / If-None-Match

ETag 通常比 Last-Modified 更精确,因为它可以根据内容生成标识。

静态资源的版本化

缓存策略最好和资源命名配合使用。文件内容变化时,文件名也变化;文件名不变时,内容也不变。

这样可以让静态资源使用长缓存,同时避免用户拿到旧代码。

HTML 与静态资源不同

HTML 页面一般不适合设置太长强缓存,因为它通常负责引用最新资源。更常见的做法是让 HTML 使用较短缓存或协商缓存,而 JS/CSS/图片使用长缓存。

小结

HTTP 缓存不是单个字段的问题,而是资源更新策略的一部分。强缓存减少请求,协商缓存减少传输,版本化文件名解决更新问题。