Cache-Control: no-cache不是强缓存而是协商缓存指令,允许缓存但每次使用前必须验证有效性;适用于HTML入口页、动态API等需及时更新的资源,服务端应返回Cache-Control: no-cache, must-revalidate。

Cache-Control: no-cache 不是强缓存,而是协商缓存的触发指令。它明确告诉浏览器:可以缓存响应内容,但每次使用前必须向服务器验证有效性(比如发带 If-None-Match 或 If-Modified-Since 的请求),不能直接复用本地副本。
如果你在 JavaScript 项目中想对某类资源(如 HTML、API 响应)设置 no-cache,关键不在 JS 代码里写,而在于服务端返回的 HTTP 响应头。
什么时候该用 no-cache
- HTML 文件:确保用户每次访问都拿到最新版本(比如单页应用的入口页)
- 动态 API 接口:内容常变,但又希望复用旧数据做比对(304 可节省带宽)
- 登录态相关资源:需及时感知服务端状态变化
怎么正确配置 no-cache 响应头
服务端需为对应资源返回:
Cache-Control: no-cache, must-revalidate
或更严格一点:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
Cache-Control: no-cache, max-age=0, must-revalidate
说明:
-
no-cache:强制每次使用前验证 -
must-revalidate:即使用户点了刷新,也不能跳过验证 -
max-age=0:强调“立即过期”,强化语义(与no-cache协同,非必需但推荐)
⚠️ 注意:不要和 immutable、public 混用——它们逻辑冲突。immutable 表示“永不更新”,no-cache 表示“每次都得问”。
前端代码里怎么配合 no-cache
- 对于 HTML 页面:由服务器统一配置,前端无需干预
- 对于 fetch 请求:可主动加请求头避免被中间缓存干扰(但不改变响应头本身):
fetch('/api/user', {
headers: { 'Cache-Control': 'no-cache' },
cache: 'no-cache' // 这个才是 fetch 的缓存策略选项
});cache: 'no-cache' 表示:允许缓存,但用前必须验证;cache: 'no-store' 才是彻底禁用缓存(不存也不读)。
常见误区澄清
- ❌
no-cache≠ “不缓存” → 它会缓存内容,只是每次用前要校验 - ❌ 在 JS 文件上设
no-cache是反模式 → JS 应走强缓存(配合哈希文件名) - ❌
Expires: 0或Date过期时间设得很早,不如Cache-Control精确,且容易因时钟不同步失效
不复杂但容易忽略。

















