CDN缓存不命中诊断

CDN 缓存诊断 响应头判定 不命中原因 更新于 2026-11-04
要诊断的地址 填 css / js / 图片这类静态资源更准,HTML 页面多数 CDN 本来就不缓存
请求次数
对照未命中
诊断结果 结论只看响应头,不做主观猜测
填好地址后点「开始诊断」
会连续请求两次,比较两次的缓存状态头,并把不命中的原因读出来

工具介绍

接了 CDN 却发现回源量没降、用户还是慢——多半是缓存压根没命中。这个工具做的是最直接的一件事:把同一个地址连发两次,看第一次的 MISS 在第二次有没有变成 HIT,然后把各家 CDN 的缓存状态头(X-Cache、CF-Cache-Status、X-Swift-CacheTime…)翻成一句人话。

只发一次请求是判断不准的:X-Cache: MISS 本身就说明前面站着一层缓存,而第一次没命中本来就很正常。连发两次、必要时再加一次带随机参数的对照请求,才能分清「没接 CDN」「接了但没缓存」「缓存了但过期太快」这三种完全不同的情况。

什么时候用得上

场景要解决的事建议设置
刚接上 CDN配置到底生效没有,静态资源是不是真在边缘返回默认(2 次 + 对照)
回源量没降钱花了但源站压力没变,问题出在哪一条3 次 · 打开对照
改版后用户看到旧页面是缓存太长,还是缓存规则没覆盖到 HTML3 次 · 打开对照
换 CDN 前测对手看看别人的静态资源是怎么设缓存头的填对方的 js / 图片地址
说不清是哪家 CDN只看 Server 与 Via 猜服务商默认

结果长什么样

第几次状态码缓存状态用时
第 1 次200MISS128 ms
第 2 次200HIT96 ms

像上面这样「第一次 MISS、第二次 HIT」就是完全正常的缓存行为。如果第二次还是 MISS,页面会列出可能的原因:TTL 是 0、no-store、带 Set-Cookie、Vary: *、状态码本身不缓存等等——全部来自响应头原文,不是猜的。

常见问题

为什么第一次必然是 MISS?

边缘节点上还没有这份内容时就会回源,这是缓存的正常填充过程。真正要看的是第二次:如果第二次变成 HIT,说明缓存是工作的;仍然 MISS 才说明有问题。

结果显示「无缓存标记」,但网站确实接了 CDN?

有些加速产品不回写缓存状态头(比如纯转发型、部分 SCDN),工具只能看到 Server 或 Via。另外动态页面、登录页这类本来就不该缓存的地址也不会有 HIT。换一个 css / js / 图片地址再测一次更准。

「对照未命中」是做什么的?

它会带一个随机参数(?_t=时间戳)再请求一次。带随机参数的 URL 一定是 MISS,所以能看到 CDN 回源时的原始响应头。如果加了参数依然是 HIT,反而说明这家的缓存键不认查询串,所有参数变体共用一份缓存——这既省缓存,也可能导致筛选页串内容。

为什么我在 A 地测试是 HIT,同事那边是 MISS?

CDN 的缓存是按节点各自的,本工具只能代表服务器这一条线路。异地、不同运营商、不同节点的命中情况本来就可能不同,要全貌得用多节点拨测。

HTML 页面一直是 MISS,正常吗?

多数 CDN 默认不缓存 HTML,或者只在很短的 TTL 内缓存,这样改版才能立刻生效。真想让 HTML 走缓存,需要在 CDN 侧单独配规则(比如 s-maxage + 版本化 URL + 发布时主动刷新)。

提示 TTL 是 0 是什么意思?

响应头里 max-age=0 或 s-maxage=0,表示内容一进缓存就过期,CDN 每次都得回源确认。静态资源应该给一年(max-age=31536000)并用文件名哈希做版本。

带 Set-Cookie 为什么就不缓存?

响应里有 Set-Cookie 通常意味着这是「给某个用户的内容」,缓存下来会把别人的会话发给别人。所以多数 CDN 一见到它就跳过缓存。静态资源不该下发 Cookie,检查一下后端中间件是不是全局加了。

诊断会对我自己的站点造成压力吗?

不会。一次诊断最多 4 个请求,只读响应头、不下载正文,每个 IP 每分钟最多 10 次。

支持 https 吗?证书有问题能测吗?

支持。证书校验失败会直接报错,不会像浏览器那样给一次「继续访问」的机会——因为 CDN 回源时同样会校验,这里报错往往就是你真实的配置问题。

更新日志

2026-10-22
功能体验升级与性能优化
2023-08-02
工具正式上线发布

相关工具推荐