排查 CDN 缓存与动态插件内容不一致,核心是区分动静资源并配置正确的缓存策略。动态插件生成的内容通常不应被 CDN 缓存,需通过源站响应头或 CDN 规则排除特定路径。
先说结论:动态插件内容不一致多因 CDN 误缓存了本应实时获取的数据,需强制动态资源回源。
- 先确认动态资源 URL 特征(如包含参数或特定路径)
- 先处理 CDN 缓存规则,设置动态路径不缓存或 TTL 为 0
- 再验证响应头 Cache-Control 是否包含 no-cache 或 private
命令速用版
使用 curl 命令检查资源响应头,确认是否命中缓存及缓存策略:
curl -I -H "Cache-Control: no-cache" https://你的域名/动态资源路径
关注返回头中的 X-Cache 字段(HIT 表示命中缓存,MISS 表示回源)及 Cache-Control 字段。
为什么会这样
CDN 默认以 URL 为键缓存资源,而动态插件内容往往 URL 不变但内容随用户或时间变化。当 CDN 节点缓存了动态插件生成的页面或接口数据,后续用户请求会直接返回旧内容,导致数据不一致。源站响应头若未明确禁止缓存,CDN 会按默认规则存储,造成动态内容被静态化处理。
分步处理
步骤 1:识别动态资源路径。检查动态插件生成的 URL 特征,例如 WordPress 后台路径/wp-admin/、带时间戳参数的接口或特定 API 目录。
步骤 2:配置 CDN 缓存规则。登录 CDN 控制台,在缓存配置中添加规则,将动态路径的缓存过期时间(TTL)设置为 0 秒,或配置忽略缓存。对于动态文件(如 php、jsp),建议设置成 0 秒,即不缓存,每次请求都回源获取。
步骤 3:调整源站响应头。在源站服务器(Nginx/Apache)配置中,为动态资源添加禁止缓存的响应头。例如 Nginx 中 location 块添加 add_header Cache-Control "no-cache, no-store, must-revalidate";。
步骤 4:执行缓存刷新。若已产生错误缓存,登录 CDN 控制台进入刷新预热目录,对源站变更的资源进行刷新。如果只更新某个文件,建议使用 URL 刷新对更新的文件进行刷新。
怎么验证是否生效
使用浏览器开发者工具网络标签页,观察动态资源请求的响应头。确认 Cache-Control 包含 no-cache 或 no-store,且 X-Cache 状态为 MISS 或 TCP_MISS。多次请求同一 URL,若内容随源站变化而实时更新,说明 CDN 已不再缓存该资源。也可通过 curl -i 命令检查 http 头信息,确认未返回旧版本内容。
常见坑
URL 参数干扰:很多同学习惯在 URL 后加动态参数,看似是区分版本,实则会让 CDN 误判为不同资源,导致缓存命中率低或缓存不一致。CDN 缓存的核心是以 URL 为 key,哪怕两个 URL 只有参数不同,CDN 也会视为两个独立资源。
源站指令优先:CDN 缓存的优先级遵循源站指令优先,如果源站服务器响应头配置了禁止缓存,哪怕 CDN 控制台设置了 TTL,也不会生效。需检查源站响应头是否包含 Pragma: no-cache 或 Cache-Control: no-cache。
节点缓存淘汰时间不一:源站更新文件后,URL 没有变化,只是内容发生变化,访问时如果节点有缓存还是会直接命中缓存。由于各个地域访问热度不一,淘汰时间不一,有的节点缓存已经淘汰,有的节点缓存还在,导致不同节点缓存内容不一致。
常见问题
为什么刷新了 CDN 缓存还是显示旧内容?
可能源站响应头设置了长缓存时间,或浏览器本地缓存未清除。需同时检查源站 Cache-Control 配置并清除浏览器缓存。
动态插件内容可以走 CDN 加速吗?
可以加速传输链路,但不应缓存内容。建议配置 CDN 规则对该路径不缓存,仅利用 CDN 网络传输动态请求。
不同地区用户访问内容不一致怎么办?
确保源站同一个 URL 的资源更新以后统一做刷新处理,并检查 CDN 域名配置是否开启了忽略参数缓存功能,避免参数导致缓存键不同。
参考来源
- CDN 缓存不生效 / 内容不更新?7 种原因 + 一键刷新方案
- 前端发版后 CDN 缓存不更新排查与最佳实践
- 不同节点缓存内容不一致
- 如何排查不同 CDN 节点缓存不一致问题
- 接入 CDN 后,网页显示的内容/下载文件/播放的视频不正确?
- 22.13.问题排查 缓存问题
- WordPress 后台 CDN 加速失效
- CDN 故障怎么办?快速排查与恢复指南