字体文件应配置强缓存:cache-control: public, max-age=31536000, immutable,配合哈希命名与nginx大小写不敏感匹配;业务图片则需短周期验证式缓存,如max-age=3600, must-revalidate,保留etag,禁用immutable。

字体文件(如 .woff2)和高频更新的业务图片,虽然都是静态资源,但变更频率、用途和缓存目标完全不同。直接套用同一套 Cache-Control 策略,反而会引发加载异常、内容 stale 或性能浪费。必须按资源特性分别设计。
字体文件:走强缓存 + 内容哈希 + immutable
字体一旦上线,通常长期不变(除非品牌升级或字重调整)。它的核心诉求是:
✅ 首次加载后,后续访问完全跳过网络请求
✅ 更新时能立刻生效,不被旧缓存阻塞
所以推荐配置:
-
Cache-Control: public, max-age=31536000, immutable - 必须配合文件名哈希(如
icon.8a3f2d.woff2),确保内容变更即 URL 变更 - Nginx 中大小写不敏感匹配:
location ~* \.(woff2|woff|ttf|eot)$ - 同时关闭 ETag(
etag off;),避免与immutable冲突 - 不建议在开发环境启用——可用
map指令按$host或$env区分生产/开发配置
这样浏览器会将其存入内存缓存(from memory cache)或磁盘缓存(from disk cache),状态码显示 200,不发任何条件请求。
业务图片:走短周期 + 验证式缓存
商品图、用户头像、运营 banner 等图片常按小时甚至分钟级更新。若设长缓存,用户看到的就是过期内容;若禁用缓存,又白白浪费带宽。
合理策略是:
-
Cache-Control: public, max-age=3600, must-revalidate(1 小时后需验证) - 或更保守:
max-age=600, stale-while-revalidate=86400(10 分钟新鲜,过期后后台静默刷新,仍可返回旧图) - 保留 ETag(默认开启),让服务器能快速返回
304 Not Modified - 若图片 URL 带时间戳或版本参数(如
?v=202607211030),也可配合max-age=0, no-cache,依赖Last-Modified或ETag验证
注意:不要对这类图片加 immutable——它明确告诉浏览器“永不变更”,会彻底绕过验证机制,导致更新不可见。
额外提醒
- 第三方托管的字体(如 Google Fonts)无法控制响应头,应优先考虑自托管关键字体
- 图片若走 CDN,需确认其支持透传
Cache-Control,或在 CDN 后台单独设置路径级缓存规则(例如/images/business/* → 1h) - 所有配置上线后,务必用 Chrome DevTools 的 Network 标签页检查对应资源的响应头和状态码,确认是否命中预期缓存行为











