| 响应头 | 值 | 说明 |
|---|
接了 CDN 却发现回源量没降、用户还是慢——多半是缓存压根没命中。这个工具做的是最直接的一件事:把同一个地址连发两次,看第一次的 MISS 在第二次有没有变成 HIT,然后把各家 CDN 的缓存状态头(X-Cache、CF-Cache-Status、X-Swift-CacheTime…)翻成一句人话。
只发一次请求是判断不准的:X-Cache: MISS 本身就说明前面站着一层缓存,而第一次没命中本来就很正常。连发两次、必要时再加一次带随机参数的对照请求,才能分清「没接 CDN」「接了但没缓存」「缓存了但过期太快」这三种完全不同的情况。
| 场景 | 要解决的事 | 建议设置 |
|---|---|---|
| 刚接上 CDN | 配置到底生效没有,静态资源是不是真在边缘返回 | 默认(2 次 + 对照) |
| 回源量没降 | 钱花了但源站压力没变,问题出在哪一条 | 3 次 · 打开对照 |
| 改版后用户看到旧页面 | 是缓存太长,还是缓存规则没覆盖到 HTML | 3 次 · 打开对照 |
| 换 CDN 前测对手 | 看看别人的静态资源是怎么设缓存头的 | 填对方的 js / 图片地址 |
| 说不清是哪家 CDN | 只看 Server 与 Via 猜服务商 | 默认 |
| 第几次 | 状态码 | 缓存状态 | 用时 |
|---|---|---|---|
| 第 1 次 | 200 | MISS | 128 ms |
| 第 2 次 | 200 | HIT | 96 ms |
像上面这样「第一次 MISS、第二次 HIT」就是完全正常的缓存行为。如果第二次还是 MISS,页面会列出可能的原因:TTL 是 0、no-store、带 Set-Cookie、Vary: *、状态码本身不缓存等等——全部来自响应头原文,不是猜的。
边缘节点上还没有这份内容时就会回源,这是缓存的正常填充过程。真正要看的是第二次:如果第二次变成 HIT,说明缓存是工作的;仍然 MISS 才说明有问题。
有些加速产品不回写缓存状态头(比如纯转发型、部分 SCDN),工具只能看到 Server 或 Via。另外动态页面、登录页这类本来就不该缓存的地址也不会有 HIT。换一个 css / js / 图片地址再测一次更准。
它会带一个随机参数(?_t=时间戳)再请求一次。带随机参数的 URL 一定是 MISS,所以能看到 CDN 回源时的原始响应头。如果加了参数依然是 HIT,反而说明这家的缓存键不认查询串,所有参数变体共用一份缓存——这既省缓存,也可能导致筛选页串内容。
CDN 的缓存是按节点各自的,本工具只能代表服务器这一条线路。异地、不同运营商、不同节点的命中情况本来就可能不同,要全貌得用多节点拨测。
多数 CDN 默认不缓存 HTML,或者只在很短的 TTL 内缓存,这样改版才能立刻生效。真想让 HTML 走缓存,需要在 CDN 侧单独配规则(比如 s-maxage + 版本化 URL + 发布时主动刷新)。
响应头里 max-age=0 或 s-maxage=0,表示内容一进缓存就过期,CDN 每次都得回源确认。静态资源应该给一年(max-age=31536000)并用文件名哈希做版本。
响应里有 Set-Cookie 通常意味着这是「给某个用户的内容」,缓存下来会把别人的会话发给别人。所以多数 CDN 一见到它就跳过缓存。静态资源不该下发 Cookie,检查一下后端中间件是不是全局加了。
不会。一次诊断最多 4 个请求,只读响应头、不下载正文,每个 IP 每分钟最多 10 次。
支持。证书校验失败会直接报错,不会像浏览器那样给一次「继续访问」的机会——因为 CDN 回源时同样会校验,这里报错往往就是你真实的配置问题。
用手机相机扫描二维码,即可继续使用该工具
遇到问题或有好建议?告诉我们。