有人发现了一个细节 | 91官网——关于缓存设置的说法:其实答案很简单但没人说…?别被带节奏,但也别装瞎

核心思路(一句话) 把“长期缓存”留给永久不变的静态文件,把“短期或不缓存”用于频繁变更的 HTML/接口结果;通过版本号/指纹化和正确的响应头实现平衡。
关键概念和实操建议
- 版本化(fingerprinting):对 JS/CSS/图片等静态资源在文件名加入哈希(例如 app.3a1b2c.js)。这样资源一旦变更就换名,浏览器和 CDN 可以长期缓存(例如 max-age=31536000),同时保证更新立刻生效。
- HTML 与动态接口:主页、模板、API 返回通常不能长期缓存。建议设置 Cache-Control: no-cache, must-revalidate 或者 Cache-Control: private, max-age=0, no-cache,根据业务场景调整。no-store 仅在敏感数据场景使用。
- Cache-Control 常用值速查:
- public, max-age=31536000, immutable —— 适合指纹化后的静态资源
- no-cache, must-revalidate —— 浏览器可缓存但每次需向服务器确认
- no-store —— 不缓存(敏感或即时性要求极高)
- stale-while-revalidate / stale-if-error —— 提升可用性与性能(CDN 支持时非常有用)
- ETag vs Last-Modified:ETag 更精确(内容变化判断),Last-Modified 简单快速。多数现代架构用 ETag 或两者并用以降低带宽。
- CDN 与边缘缓存:CDN 在世界各地缓存资源、降低延迟。确保 CDN 的缓存规则与源站头部一致,必要时在 CDN 层设置自定义缓存策略。常见错误是源站返回长缓存但 HTML 里引用的静态资源没有使用指纹化。
- Service Worker:能将缓存策略做到客户端最细化,但同时也容易导致“更新看不到变化”的问题。实现时把更新流程做清晰(例如跳过等待或主动提示用户刷新)。
- 自动化与部署:把缓存头设置纳入 CI/CD 流程。部署时自动生成指纹、自动更新清单,避免人工出错。
常见陷阱(别被带节奏)
- 盲目把所有东西都设置为一年缓存:这会让用户一直看到旧内容,除非你严格做指纹化。
- 把 HTML 设置为强缓存而不做版本管理:内容更新后用户看不到最新页面。
- 只信任“某某大神的经验贴”:不同站点与流量特性不同,验证比跟风更可靠。
快速检查清单(发布前可以跑一遍)
- 静态资源是否有文件名指纹?(例如带哈希)
- 静态资源的响应头是否为 long max-age + immutable?
- HTML 是否为 no-cache 或短期缓存?
- CDN 设置是否与源站一致?是否有预热或清理策略?
- 本地开发与生产环境的 cache 策略是否区分开?
- 通过浏览器 DevTools 或 curl 检查实际响应头,模拟用户更新场景验证是否能正常拿到新版资源。
结尾一句话 缓存不是“越多越好”也不是“都别缓存”;用对策略,用户体验和运维成本都会变得舒服。需要我帮你把现有站点的缓存策略做一次快速诊断,给出一套可直接落地的配置?发来你的响应头或部署流程截图,我们一起把问题拆了。