← 返回工具箱

开发 / HTTP CACHING

Cache-Control 生成器与诊断

组合浏览器缓存、CDN 共享缓存与陈旧响应策略,也可以粘贴线上 Header 检查重复指令、参数错误和相互冲突的语义。

常用策略

缓存作用域与新鲜度

no-cache 不等于不缓存

no-cache 允许浏览器或 CDN 保存响应,只是在每次复用前必须向源站成功验证。若响应根本不应落入缓存,应使用 no-store。

s-maxage 只控制共享缓存

浏览器私有缓存看 max-age;CDN、反向代理等共享缓存优先看 s-maxage。private 会阻止共享缓存存储,因此与 s-maxage 同时使用通常没有意义。

Header 不是完整缓存事实

方法、状态码、Date、Age、Expires、ETag、Last-Modified、Vary、请求头和 CDN 配置都会影响最终行为,线上仍要查看真实响应与缓存日志。

规范依据

核心指令与新鲜度判断依据 RFC 9111 HTTP Caching; stale-while-revalidate 和 stale-if-error 来自 RFC 5861。 估算器只计算当前输入能确定的范围,不模拟所有浏览器与 CDN 私有扩展。

RELATED TOOLS

查看全部工具 →

USE & REVIEW

Cache-Control 生成器与缓存诊断常见问题

查看全部工具指南 →

no-cache 和 no-store 有什么区别?

no-cache 允许缓存保存响应,只是每次复用前都必须向源站成功验证;no-store 才是要求缓存不保存响应。登录页并不一定都要 no-store,是否包含敏感内容、能否被私有缓存保存以及业务合规要求都要单独判断。

public、private、max-age 和 s-maxage 分别控制什么?

public 明确允许共享缓存保存,private 只允许浏览器等私有缓存保存。max-age 给出通用新鲜期,s-maxage 只覆盖共享缓存的新鲜期并优先于 max-age。private 与 s-maxage 同时出现通常没有实际意义,因为合规共享缓存本就不能存储该响应。

stale-while-revalidate 和 stale-if-error 会一直返回旧内容吗?

不会。它们都在正常新鲜期结束后提供有限秒数窗口:前者允许先返回旧副本并在后台验证,后者允许在源站出错时尝试旧副本。不同 CDN 的支持、上限和私有扩展并不完全相同,涉及价格、权限或库存的内容还要评估短暂过期数据是否可接受。

immutable 应该用于 HTML 吗?

通常用于文件名带内容 Hash 的 CSS、JS、字体或图片,例如 app.a1b2c3.js。资源内容变化时 URL 也变化,旧 URL 才能安全缓存很久。普通 HTML、固定文件名或后台会原地覆盖的资源不适合轻易加 immutable,否则用户可能长时间拿到旧版本。

工具显示“新鲜”就代表 CDN 一定命中吗?

不代表。估算器只根据当前 Cache-Control 和输入 Age 计算显式窗口。请求方法、状态码、Date、Expires、ETag、Vary、Authorization、Set-Cookie、请求指令、CDN 绕过规则和缓存键都可能改变实际结果,应继续检查线上响应头、CDN Cache-Status 或平台日志。

生成的 Next.js、Nginx 和 Vercel 配置可以直接上线吗?

它们是可复核的起点,示例路径仍要换成真实资源范围。先在预览环境确认 HTML、静态资源、API 和登录页面没有套错策略,再用浏览器网络面板或 curl 检查源站与 CDN 最终返回的 Header;不要只看配置文件就认定缓存已经生效。