无头CMS内容同步,多终端内容统一更新

无头CMS把内容存储和页面展示拆开了,编辑在后台发布文章后,网站、App、小程序往往不会自动更新,需要手动刷新或等缓存过期。
本文用Strapi为例,讲清楚如何通过Webhook和API让多终端内容统一更新,读完你能独立配好一套自动同步链路。

先理清同步链路和前置条件

无头CMS内容同步的核心逻辑是:内容变更 → 触发通知 → 各终端拉取新数据 → 刷新展示
你需要在服务器上准备好以下环境:

  • 一个运行中的无头CMS,本文以Strapi v4为例,默认端口1337
  • 至少一个前端站点,比如Next.js或Nuxt项目,部署在/www/wwwroot/frontend
  • 服务器能执行curlnode命令,宝塔面板用户可直接用终端
  • 如果前端用了CDN,需要拿到CDN的刷新API密钥

先在CMS后台创建一个测试文章,记下它的API地址,比如http://你的IP:1337/api/articles
在浏览器访问这个地址,能返回JSON数据说明API正常。

配置Webhook让CMS主动通知

Strapi后台自带Webhook功能,路径是设置 → Webhooks → 创建新Webhook
填写前端接收地址,比如https://你的域名/api/revalidate,勾选entry.createentry.updateentry.delete三个事件。
保存后,每次发布或修改文章,Strapi就会向这个地址发送POST请求。

前端项目需要写一个接收接口。
以Next.js的pages/api/revalidate.js为例:

import { revalidatePath } from 'next/cache'

export default async function handler(req, res) {
  if (req.method !== 'POST') return res.status(405).end()
  const secret = req.headers['x-webhook-secret']
  if (secret !== process.env.WEBHOOK_SECRET) {
    return res.status(401).json({ message: '无效密钥' })
  }
  try {
    await revalidatePath('/articles/[slug]', 'page')
    return res.json({ revalidated: true })
  } catch (err) {
    return res.status(500).json({ message: '刷新失败' })
  }
}

在Strapi的Webhook设置里添加请求头x-webhook-secret,值和前端环境变量一致。
这样每次内容变更,前端页面会自动重新生成。

用API拉取实现App和小程序同步

网站之外的终端,比如App和小程序,通常不能直接接收Webhook。
更稳的做法是让它们定时调用CMS的API。
在App启动或下拉刷新时请求/api/articles?
sort=updatedAt:desc
,按更新时间倒序拿最新数据。

如果数据量较大,建议加一个updatedAt过滤参数,只拉取上次同步之后的内容:

curl -H "Authorization: Bearer 你的API令牌" \
  "http://你的IP:1337/api/articles?filters[updatedAt][$gt]=2025-01-01T00:00:00.000Z"

把返回的JSON存到本地数据库或缓存中,界面渲染时直接读本地数据。
这样即使CMS临时不可用,App也能展示上次同步的内容。

缓存刷新和避坑要点

CDN缓存是最容易被忽略的一环。
前端页面更新了,但CDN还返回旧内容,用户看到的仍然是旧文章。
宝塔面板用户可以在网站 → CDN中配置刷新,或者调用CDN厂商的刷新接口:

curl -X POST "https://cdn.example.com/refresh" \
  -H "Authorization: Bearer 你的CDN密钥" \
  -d '{"urls":["https://你的域名/articles/测试文章"]}'

几个常见坑:

  • Webhook地址必须公网可访问,本地localhost收不到请求
  • 密钥不要写在前端代码里,用环境变量存储
  • Strapi默认权限可能禁止公开读取,需要在设置 → 用户与权限 → 角色中给Public角色勾选findfindOne
  • 循环触发:前端刷新页面时又调用了CMS写接口,会导致无限循环,务必让接收接口只读不写

验证同步是否真正生效

改一篇测试文章的标题,保存后观察三个地方:网站页面标题是否变化、App下拉刷新后是否显示新标题、CDN缓存是否命中新内容。
如果网站变了但App没变,检查App的API请求是否带了updatedAt过滤条件;
如果都没变,去Strapi的Webhook日志里看请求是否成功发出。

整个链路跑通后,日常发布内容只需要在CMS后台点一次保存,所有终端会在几秒到几分钟内自动更新。
建议先用测试文章验证,确认无误再应用到正式内容。

常见疑问

Webhook和定时轮询哪个更好?
Webhook实时性高,适合网站这类能接收请求的终端;轮询实现简单,适合App和小程序。两者可以同时用,互不冲突。

Strapi重启后Webhook会丢失吗?
Webhook配置存在数据库中,重启不会丢失,但需要确认数据库连接正常。

前端刷新接口返回401怎么排查?
先检查请求头里的密钥是否和前端环境变量一致,再确认Strapi Webhook的请求头名称有没有拼错,大小写敏感。

分享到:
上一篇
DoraCMS前后端分离打包,静态站点部署CDN
下一篇
CMS站群防关联,多站点IP与域名隔离方案
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意