故障现象
织梦后台替换了文章封面图、修改了 Logo、上传了新版 banner,但用户访问仍是旧图。源站服务器上文件已是最新,CDN 边缘节点却持续返回旧版本。这种“CDN 缓存不刷新”问题会让用户看到过期内容,影响运营活动与品牌一致性,需要按链路逐层定位。
缓存不刷新的根因
- 未主动调用刷新 API,等自然过期时间过长。
- 刷新 URL 与实际访问 URL 不一致(带不带 https、有没有参数)。
- 浏览器本地缓存未清,误判为 CDN 不刷新。
- Cache-Control 设置过长,CDN 按头部缓存几周。
- 刷新任务排队或失败,刷新记录需查看。
- 使用了 CDN 多层(CDN 套 CDN),只刷了最外层。
排查流程
第一步:确认源站已更新
# 直接请求源站,绕过 CDN
curl -I -H "Host: img.example.com" \
https://10.0.0.9/uploads/allimg/202407/1.jpg
# 关注 Last-Modified 与 Content-Length 是否最新
第二步:对比 CDN 节点返回
curl -I https://img.example.com/uploads/allimg/202407/1.jpg
# 关注 X-Cache 命中状态、Age 字段
# 若 Age 很大说明缓存很久未刷新
第三步:排除浏览器缓存
用隐身模式或加随机参数访问:
https://img.example.com/uploads/allimg/202407/1.jpg?v=20240729
若加参数后是新图,说明是浏览器缓存;加参数仍是旧图才是 CDN 问题。
主动刷新方案
方案一:调用 CDN 刷新 API
以阿里云 CDN 为例,用 OpenAPI 刷新 URL:
# 安装 aliyun-cli
aliyun cdn PushObjectCache --ObjectPath \
"https://img.example.com/uploads/allimg/202407/1.jpg" \
--ObjectType File
# 刷新整个目录
aliyun cdn PushObjectCache --ObjectPath \
"https://img.example.com/uploads/allimg/202407/" \
--ObjectType Directory
腾讯云、七牛、又拍均有对应 API,刷新后通常 5 分钟内全网生效。
方案二:版本号强制更新
对于 logo、banner 这类高频更新的固定图片,在模板里给 URL 加版本号:
<img src="https://img.example.com/logo.png?v={dede:global.cfg_logo_version/}">
# 后台改图后同步更新 cfg_logo_version
版本号变化即触发浏览器与 CDN 重新回源,无需手动刷新。
方案三:缩短 Cache-Control
对易变图片降低缓存时间,在 Nginx 加响应头:
location ~* ^/uploads/allimg/.*\.jpg$ {
expires 1h;
add_header Cache-Control "public, max-age=3600";
}
# 静态不变的图仍可长期缓存
location ~* ^/uploads/logo/.*\.png$ {
expires 30d;
}
刷新最佳实践
| 场景 | 推荐方式 |
|---|---|
| 单图更新 | API 刷新 URL |
| 批量更新 | API 刷新目录 |
| 高频更新 | 版本号方案 |
| 紧急全量 | 刷新全站预热 |
| 程序自动 | 上传后自动调 API |
每天刷新有配额限制(阿里云 URL 刷新每天 2000 条),高频更新场景优先用版本号方案。
自动刷新集成
把 CDN 刷新接入织梦上传流程,图片替换后自动触发刷新:
// 在上传覆盖旧图成功后调用
function refresh_cdn($urls) {
$ch=curl_init('https://cdn.aliyuncs.com');
// 签名调用 PushObjectCache
// $urls 是数组
return $result;
}
// 上传完成
if ($replaced) {
refresh_cdn([$oldUrl]);
}
注意事项
- 刷新 URL 必须带协议、域名,与用户访问完全一致。
- 刷新记录要保留,便于追溯误刷。
- 频繁刷新会消耗配额,影响命中率。
- HTTPS 站点务必刷新 https 与 http 两种 URL。
- 多层 CDN 要逐层刷新,最内层先刷。
建议与后续
把“图片更新—CDN 刷新—效果验证”串成自动化链路:上传后自动调刷新 API,刷新完成后脚本回源校验新文件是否已分发,失败重试或告警。同时把刷新配额用量接入监控,临近上限时提醒运营错峰刷新。让织梦图片更新具备分钟级全网生效的能力,运营活动不再被缓存拖累,用户体验持续稳定。