Cache-Control 中 no-store 与 max-age 冲突:如何快速止损
定位并修复缓存指令冲突,避免命中率波动和回源抖动导致的线上不稳定。
当 `no-store` 与 `max-age`/`immutable` 同时出现时,不同缓存层会产生不同解释。这个问题页给你一条可执行的修复链路。
本指南涉及工具
Symptoms(现象)
- 同一资源时而命中缓存、时而回源,表现不稳定。
- CDN 与浏览器对同一 URL 的缓存行为不一致。
- 带登录态接口偶发返回过期或错误用户数据。
Root Cause(根因)
- `no-store` 与 `max-age` / `immutable` 混用,语义冲突。
- `private` 与共享缓存策略没有分层,策略边界不清晰。
- 缺少 `ETag` / `Last-Modified`,TTL 到期后只能硬回源。
Fix Steps(修复步骤)
- 先解析原始 Cache-Control,移除冲突指令。
- 按响应类型拆分策略:鉴权/会话接口走 no-store/private,静态或可缓存 API 走明确 TTL。
- 若希望过期后平滑服务,补 `stale-while-revalidate` 与验证头,建立可控重验证路径。
敏感接口推荐缓存基线
Cache-Control: private, no-store
Pragma: no-cacheRelated Tool Workflow
FAQ
no-store 和 max-age 能不能一起写?
规范上可写,但运维语义冲突,建议避免。
什么时候该用 stale-while-revalidate?
适合非敏感、允许短暂陈旧的可缓存内容。