cache-control的max-age指令以整数秒设置缓存时长,优先于expires;需区分资源类型设值,配合s-maxage控制cdn,加stale-while-revalidate可实现过期后仍用缓存并后台更新。

直接用 Cache-Control 的 max-age 指令设置秒数,比如 max-age=31536000 表示缓存 1 年。它比 Expires 更可靠,是 HTTP/1.1 标准,浏览器优先认它。
Cache-Control 的 max-age 必须是整数秒
不是“1h”或“30d”,也不能加引号或单位:
✅ 正确:Cache-Control: public, max-age=3600
❌ 错误:Cache-Control: max-age="3600" 或 max-age=1h
不同资源类型推荐值要区分
- HTML 入口页(常更新):
max-age=60(1 分钟),避免用户卡在旧版 - 带哈希的静态资源(如
app.a3f2.js):max-age=31536000(1 年),文件名变就自动走新缓存 - 含用户信息的页面(如个人中心):
private, max-age=300(5 分钟),只让浏览器缓,CDN 不存
public 和 private 决定能否被 CDN 缓存
-
public:允许浏览器和中间代理(如 CDN)都缓存 -
private:仅浏览器可缓,CDN 会跳过——别指望靠它控制 CDN 行为
别单独依赖 max-age 控制 CDN
CDN 主要看 s-maxage。如果只写 max-age=300 却没写 s-maxage,CDN 可能因响应头含 private 或自身策略不缓存。需要显式加上:Cache-Control: public, s-maxage=300, max-age=60
→ CDN 缓 5 分钟,浏览器只缓 1 分钟
配合验证机制才真正省带宽
设了 max-age 只是“不发请求”,但过期后首次请求仍要走完整流程。若想过期后还能快速返回旧内容并后台更新,加 stale-while-revalidate:Cache-Control: public, s-maxage=300, max-age=60, stale-while-revalidate=600
→ 浏览器过期后 10 分钟内仍可用缓存,同时悄悄拉新
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











