多城市或多分站场景下,最头疼的问题是数据互相干扰:一个分站的内容跑到另一个分站,或一个分站的设置影响全局。本文讲解如何让各分站数据真正独立、互不干扰。
一、数据干扰的常见表现
- 分站首页调用了其他分站的文章。
- 一个分站管理员能看到、操作全站内容。
- 静态生成时各分站页面互相覆盖。
- 分站配置(如TDK、联系方式)被主站统一覆盖。
二、数据隔离的几个层面
1. 内容层隔离
每个分站对应独立栏目(栏目树),内容按栏目归属。调用时严格限定typeid为该分站栏目ID,避免跨站调用。
2. 字段层隔离
若共用内容池,通过地区/分站字段区分。所有调用都加该字段过滤,确保只返回本分站数据。
3. 配置层隔离
分站的TDK、联系方式、banner等不写入全局配置,而是存入分站专属配置表或单页,按城市读取。
三、栏目隔离实现
为每个分站建立独立栏目树,如:
主站 ├─ 北京分站(栏目ID 10) │ ├─ 北京新闻(11) │ └─ 北京产品(12) ├─ 上海分站(栏目ID 20) │ ├─ 上海新闻(21) │ └─ 上海产品(22)
分站首页只调用本栏目树下数据。使用arclist时指定typeid,或通过typeid='top'限定顶级栏目。
四、共用内容池的字段隔离
若选择共用栏目,附加表增加siteid字段标记归属分站。调用时强制拼接:
$where="siteid=".$currentSite; $sql="SELECT * FROM dede_archives a LEFT JOIN dede_addoninfo b ON a.id=b.aid WHERE $where";
关键是在所有调用入口统一加入siteid过滤,任何遗漏都会导致数据串站。
五、管理员权限隔离
1. 角色按分站划分
在织梦后台为每个分站创建独立管理员角色,通过"栏目权限"限制其只能管理本分站栏目。其他分站栏目对该管理员不可见、不可编辑。
2. 文档权限
开启文档权限控制,确保分站管理员只能发布、修改本分站文档,防止误操作其他分站内容。
六、静态生成隔离
各分站静态文件分目录存放,避免覆盖。可在生成逻辑中按城市写入不同目录:
/html/bj/... /html/sh/...
对应URL规则也按城市区分,如bj.example.com/news/1.html读取/html/bj/news/1.html。
七、缓存与配置隔离
- 缓存键加
siteid前缀,避免分站间缓存串读。 - 分站配置存独立表,如
dede_site_config,字段:siteid、key、value。 - TDK、联系方式、广告位等均从分站配置读取。
八、设置落地建议
建议在搭建分站之初就确定隔离方案,优先选择"栏目隔离+权限隔离+生成目录隔离"的组合,这是最稳妥的物理隔离方式。共用内容池方案虽省事,但任何调用遗漏都会串站,适合开发规范严格的团队。无论哪种方案,都应在上线前用多分站数据交叉验证,确认无串站后再对外开放。