无头CMS多端同步,网站小程序APP内容统一更新
无头CMS多端同步的核心思路是:内容只在后台录入一次,网站、小程序和APP都通过API拉取同一份数据,避免多端重复编辑。
本文以Strapi为例,带你在Linux服务器上完成部署、API对接和缓存刷新,最终让三端内容保持一致。
如果你正在维护多个内容出口,这套流程可以直接照做。
部署前的环境确认
先确认服务器可以运行Node.js。
推荐使用Ubuntu 22.04或CentOS 7以上版本,内存不低于1GB,否则Strapi构建阶段容易因内存不足中断。
登录服务器后检查版本:
node -v
npm -v
如果未安装,用NodeSource源安装Node.js 18 LTS:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
安装完成后再次执行node -v,能输出v18.x即可。
用Strapi创建内容模型并开放API
新建项目目录并初始化Strapi:
npx create-strapi-app@latest my-cms --quickstart
--quickstart会自动使用SQLite并启动服务,默认地址为http://服务器IP:1337/admin。
首次访问需要注册管理员账号。
登录后台后,进入Content-Type Builder创建集合类型,例如article,添加字段:title文本、content富文本、cover媒体、publishedAt日期。
保存后Strapi会自动重启。
接着开放API权限:进入Settings → Roles → Public,找到Article权限,勾选find和findone,保存。
在服务器上验证接口是否可用:
curl http://127.0.0.1:1337/api/articles
如果返回JSON数据,说明API已开放。
若返回403,回到Roles里检查Public权限是否勾选。
三端如何调用同一份内容
网站端建议在构建时拉取数据,生成静态页面。
以Next.js为例,在pages/index.js中使用getStaticProps:
export async function getStaticProps() {
const res = await fetch('http://你的服务器IP:1337/api/articles');
const data = await res.json();
return { props: { articles: data.data }, revalidate: 60 };
}
revalidate: 60表示每60秒重新验证一次,适合内容更新不频繁的站点。
小程序端在onLoad中调用同一接口:
wx.request({
url: 'https://你的域名/api/articles',
success(res) { this.setData({ list: res.data.data }) }
})
注意小程序要求HTTPS域名,需在微信公众平台配置request合法域名。
APP端用OkHttp或Axios请求同一地址即可,逻辑与网站一致。
关键点:三端只认接口地址,不直接读数据库,这样后台改一次,三端同时生效。
内容更新后如何让三端立即生效
Strapi保存内容后,API数据会立即变化,但网站静态页和小程序本地缓存可能还是旧内容。
网站端如果用了CDN或Nginx缓存,需要刷新缓存。
宝塔面板操作路径:网站 → 设置 → 缓存 → 刷新缓存。
命令行方式:
# Nginx清除代理缓存
rm -rf /www/server/nginx/cache/*
nginx -s reload
小程序端可以在onShow里重新请求接口,或在后台配置定时拉取。
APP端建议加下拉刷新,同时设置接口请求头Cache-Control: no-cache,避免读到旧数据。
判断同步是否成功的标准:在Strapi后台修改一篇文章标题,30秒内网站、小程序、APP三端显示一致,即为成功。
容易踩坑的几个地方
第一,Strapi默认只监听127.0.0.1,外网访问需要修改config/server.js中的host为0.0.0.0,或在启动时加HOST=0.0.0.0。
改完记得放行防火墙端口:
sudo ufw allow 1337
第二,生产环境不要用SQLite,建议换成MySQL或PostgreSQL。
数据库连接信息写在.env文件里,修改后需重启Strapi。
第三,小程序和APP的接口域名必须备案并配置HTTPS。
如果暂时没有域名,可以用Nginx反向代理加自签证书测试,但正式发布前必须换成受信任证书。
第四,Strapi升级或修改内容类型后,记得重新检查Public权限,有时更新会重置权限配置。
验证多端同步是否真的生效
完成以上配置后,按下面清单逐项检查:
- 在Strapi后台新建一篇文章,状态设为已发布。
- 浏览器直接访问
https://你的域名/api/articles,确认能返回新文章。 - 打开网站页面,强制刷新(Ctrl+F5),确认标题和内容已更新。
- 打开小程序,下拉刷新或重新进入页面,确认列表出现新文章。
- 打开APP,执行下拉刷新,确认内容一致。
如果某一端没更新,先检查该端请求的接口地址是否与后台一致,再检查是否有本地缓存或CDN缓存未清除。
无头CMS多端同步的稳定性,取决于接口地址统一、缓存策略明确和权限配置正确这三件事。
常见疑问
问:不用Strapi,用其他无头CMS可以吗?
可以。WordPress开启REST API、Directus、Contentful都支持类似模式,核心逻辑都是内容存一处、多端走API。选择时重点看是否支持你需要的字段类型和权限粒度。
问:内容更新后小程序必须重新审核吗?
不需要。只要小程序代码没变,只是接口返回的数据变化,用户端刷新即可看到新内容,不涉及重新提交审核。
问:接口被恶意请求怎么办?
在Nginx层加频率限制,或在Strapi中配置API Token,只允许携带Token的请求读取数据。公开接口建议只开放find,不开放写入权限。