CCP

Cache-Control 解析器

解析缓存指令,对比浏览器与共享缓存的新鲜度

API 与 HTTP
🔒 100% 本地运行 — 你的数据不会离开当前页面
由 Evan 维护•最近更新:2026年9月30日•最近复核:2026年9月29日
选项模式

每行输入一条响应头的 Cache-Control 值,查看新鲜度秒数、存储限制和提示。高级模式提供具体案例。

仅分析响应指令,不能单凭此头保证可缓存或实际命中。还需核对请求方法、状态码、Authorization、Vary、缓存条目及实现。模拟器假定你已提供当前响应年龄,不计算 Age/Date,不模拟 Expires、启发式新鲜度、请求指令、离线策略或完整扩展行为。

输出
解析结果会显示在这里
浏览器内本地处理
页面阅读模式

完整说明还包括常见问题处理、操作示例、代码片段、FAQ 和相关工具,便于核对结果或排查问题。

工具说明

Cache-Control 解析器逐行读取响应头值,展示指令、存储限制与新鲜度信息。以 public, max-age=60, s-maxage=600 为例:浏览器的新鲜度时长为 60 秒,共享缓存则为 600 秒,两者可以正常并用。对于 no-store, max-age=600,max-age 不会带来存储或复用许可;若目标仍是禁止存储,可简化为 no-store。private, no-cache 在满足其他条件时允许私有缓存存储,但每次复用前必须成功验证。模拟结果只是对部分指令的解释,不能证明真实浏览器或 CDN 一定会缓存响应。工具不完整建模请求、响应状态、Authorization、Vary 匹配、CDN 覆盖规则,也不模拟依赖状态码的 must-understand 例外。所有解析均在浏览器本地完成。

对比决策

禁止存储与每次复用前验证

no-store

适合要求缓存不得保存或复用响应的场景。

private, no-cache

适合允许私有缓存保存,但每次复用前都必须成功验证的场景。

补充:示例使用不带参数的指令,且假定不存在依赖状态码的 must-understand 等覆盖规则。no-store 是缓存指令,不是完整的隐私保护保证。

高频问题直答

Q01

no-store, max-age=600 允许缓存十分钟吗?

不允许。对于这条响应头,no-store 禁止存储和复用响应,max-age 不会添加存储许可。若要保留原策略并去掉无效指令,可简化成 no-store。

Q02

max-age=60 与 s-maxage=600 互相矛盾吗?

不矛盾。在 public, max-age=60, s-maxage=600 中,浏览器的新鲜度时长为 60 秒,共享缓存的新鲜度时长为 600 秒;能否存储仍取决于完整请求和响应。

Q03

immutable 与 must-revalidate 可以同时使用吗?

可以。immutable 描述响应仍新鲜时的复用,must-revalidate 则要求陈旧响应必须成功验证后才能复用。它们针对不同阶段,本身不矛盾。

Q04

这个模拟器不处理哪些条件?

工具不建模请求方法、响应状态、Authorization、Vary 匹配、验证器、CDN 配置、Expires 或启发式新鲜度,也不模拟 must-understand:理解相应状态码缓存要求的缓存,在特定条件下可以忽略 no-store。带字段参数的 private/no-cache、非法或重复的新鲜度数值会返回 UNKNOWN。仅凭响应头分析不能证明真实请求会命中缓存。

失败门诊(高频踩坑)

看到 public 或正数 max-age 就认定会命中缓存

原因:Cache-Control 值无法描述请求、响应状态、缓存键、Authorization 处理或缓存配置。

修复:结合完整请求响应及实际缓存状态验证,把工具结果用作指令层面的说明。

把响应年龄等于 max-age 仍算作新鲜

原因:新鲜度判断采用严格小于:当前年龄必须小于新鲜度时长。

修复:对于 max-age=60,年龄 59 秒仍新鲜,60 秒已经陈旧;是否验证或允许陈旧复用需要另行判断。

把缺少 TTL 理解成立即过期

原因:Expires 或启发式新鲜度可能在这个头部之外提供时长。

修复:此时应说明仅凭 Cache-Control 无法判断新鲜度,并检查其余响应头。

场景配方

01

简化响应头时保留禁止存储的策略

目标:移除无效的新鲜度指令,同时保持禁止存储。

  1. 把 no-store, max-age=600 作为一条响应头值解析。
  2. 保留 no-store、移除 max-age=600,不要改成 public 或只剩 TTL 的策略。
  3. 在浏览器 Network 面板和源站/CDN 配置中检查最终响应;若包含 must-understand,另行核对依赖状态码的行为。

结果:对这个具体示例,简化后的 no-store 仍禁止缓存存储和复用响应。

生产可用片段

保留禁止存储的要求

HTTP

Cache-Control: no-store

浏览器 60 秒,共享缓存 600 秒

HTTP

Cache-Control: public, max-age=60, s-maxage=600

允许私有存储,每次复用前验证

HTTP

Cache-Control: private, no-cache

推荐工作流

常见问题

no-store 与 max-age 是互相冲突的指令吗?

在 no-store, max-age=600 中,no-store 禁止存储和复用响应,max-age 不会覆盖这项限制。若仍要禁止存储,清理后应保留 no-store。依赖状态码的 must-understand 例外不在本工具模拟范围内。

max-age 和 s-maxage 可以同时出现吗?

可以。public, max-age=60, s-maxage=600 为浏览器设置 60 秒新鲜度,为共享缓存设置 600 秒新鲜度。它们作用于不同范围,不属于 TTL 冲突。

private, no-cache 表示什么?

这里不带参数的 private 排除共享缓存存储。在满足其他条件时,私有缓存可以保存响应,但 no-cache 要求每次复用前都成功验证,不能把它理解成禁止存储。

只看这个响应头,就能确定真实请求会命中缓存吗?

不能。存储和复用还依赖请求方法、响应状态、Authorization、Vary、验证器及缓存实现和配置。理解特定状态码缓存要求的缓存还可能通过 must-understand 忽略 no-store;工具不模拟该例外。

新鲜度模拟怎样判断?

工具将输入的响应年龄与显式新鲜度时长比较:只有年龄严格小于时长才算新鲜,等于时长时已经陈旧。没有可用的 max-age 或 s-maxage 时,仅凭此头无法判断新鲜度;工具不计算 Expires 或启发式新鲜度。

支持本地批量解析吗?

支持。每行作为一条独立响应的 Cache-Control 值分析,不会把多行合并成一个响应;所有解析均在浏览器中完成。

继续浏览