CDN缓存失效了?用一行curl快速定位

封面图(备选)
CDN缓存判断

CDN缓存失效了?用一行curl快速定位

静态资源部署后用户还是看到旧版本,浏览器清缓存也没用。第一时间不是怀疑CDN,而是用curl命令确认缓存状态。但看哪个响应头、怎么看,很多人说不清楚。本文3分钟讲清楚。

核心命令:curl -sI 读响应头

curl -sI https://你的域名/app.js
HTTP/2 200
content-type: application/javascript
date: Tue, 02 Jun 2026 06:00:00 GMT
cache-control: public, max-age=31536000
cf-cache-status: HIT
age: 86400
server: cloudflare

判断缓存是否命中,只需看两个字段:

  • cf-cache-status — CDN缓存状态,常见值:HIT(命中)、MISS(未命中)、EXPIRED(已过期)、BYPASS(被强制回源)
  • age — 资源在CDN节点存活了多少秒。age: 0 说明刚回源;age: 86400 说明24小时前就缓存了

国内常用CDN的缓存状态头

# 阿里云CDN
x-cache: HIT TCP_HIT | MISS TCP_MISS

# 腾讯云CDN
x-cdn-cache: HIT | MISS

# AWS CloudFront
x-cache: Hit from cloudfront | Miss from cloudfront

实战:部署后用户看到旧版本(cache-status BYPASS)

一个Nuxt项目构建后部署到CDN,versionhash每次变,但用户反馈还是看到旧JS。排查过程:

# 第一步:确认是哪个缓存头
curl -sI https://你的域名/_nuxt/app/a1b2c3.js | grep -E 'cf-cache-status|age|cache-control'

cf-cache-status: BYPASS
age: 0
cache-control: public, max-age=31536000

# 同一个文件的第二次请求
curl -sI https://你的域名/_nuxt/app/a1b2c3.js | grep -E 'cf-cache-status|age'

cf-cache-status: HIT
age: 0

第一次请求 BYPASS,说明CDN跳过缓存直接回源了。原因在配置:CDN控制台有"过滤器"规则,忽略了 cache-control: public,强制每次回源验活。

解决办法:CDN控制台 → 缓存配置 → 关闭"忽略Cache-Control"选项,或者把静态资源的缓存策略从"每次验活"改为"缓存+被动过期检查"。

导致缓存失效的4个配置原因

1. Cache-Control 设置了 no-cache 或 private

# 源站返回了这条头
cache-control: no-cache, max-age=0

# CDN收到后每次都向源站发起验证请求,而不是直接返回缓存

no-cache 不等于"不缓存",而是"每次用缓存前必须验活"。private 才是真正的不缓存——只有浏览器能存,CDN不许碰。

2. 请求带了 Authorization 或 Cookie

# 带Cookie的请求,CDN默认不缓存
curl -sI https://你的域名/page.html -H "Cookie: session=abc"

# 如果源站响应头有 vary: Cookie
vary: Cookie
# CDN会为每个不同的Cookie值单独建一个缓存版本
# 所以有100个用户就有100个缓存副本

3. 响应头有 Vary: Accept-Encoding

vary: Accept-Encoding

这条头告诉CDN:用gzip压缩和未压缩的同一个URL是两个不同的缓存对象。如果请求头没带 Accept-Encoding(比如curl默认不带),CDN可能把未压缩版本返回给需要gzip的浏览器。

4. CDN缓存规则TTL设置太短

在CDN控制台查看各文件类型的缓存 TTL。常见配置陷阱:

  • HTML文件设置了"不缓存"(每次回源)
  • 静态资源设置了5分钟TTL(构建后旧文件还在CDN里存活)
  • 跨域文件(.woff2/.ttf)被单独设置了短TTL

排查清单(按顺序执行)

# 第1步:确认缓存状态
curl -sI https://你的域名/资源路径 | grep cf-cache-status

# 第2步:看 age 值
curl -sI https://你的域名/资源路径 | grep ^age

# 第3步:检查 Cache-Control
curl -sI https://你的域名/资源路径 | grep cache-control

# 第4步:检查 Vary 头
curl -sI https://你的域名/资源路径 | grep vary

# 第5步:对比CDN和源站的响应时间
time curl -sI https://你的域名/资源路径 > /dev/null
time curl -sI https://源站内网地址/资源路径 > /dev/null

现在你可以做什么

用以下命令检查你网站的关键静态资源(JS/CSS/图片)缓存状态:

# 检查CDN缓存状态(Cloudflare为例)
curl -sI https://你的域名/main.js | grep -E 'cf-cache-status|age|cache-control'

# 如果是阿里云CDN
curl -sI https://你的域名/main.js | grep -E 'x-cache|cache-control'

# 如果是腾讯云CDN
curl -sI https://你的域名/main.js | grep -E 'x-cdn-cache|cache-control'

看到 HITage 大于60,说明缓存正常工作。看到 MISSBYPASS,按上面的4个原因逐一排查:先查 cache-control,再看 vary,最后检查CDN控制台的缓存规则。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享