织梦cdn缓存图片更新不刷新

CDN 缓存与源站不同步,逐层排查刷新链路

故障现象

织梦后台替换了文章封面图、修改了 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,刷新完成后脚本回源校验新文件是否已分发,失败重试或告警。同时把刷新配额用量接入监控,临近上限时提醒运营错峰刷新。让织梦图片更新具备分钟级全网生效的能力,运营活动不再被缓存拖累,用户体验持续稳定。