织梦支持多城市分站搭建吗
织梦CMS 本身没有原生的多城市分站模块,但凭借其灵活的栏目体系与自定义字段,完全可以通过“二级域名 + 城市栏目 + 模板切换”的方式搭建出结构清晰的多城市分站。本文给出一套可落地的实施方案。
一、多城市分站的常见架构
- 二级域名模式:bj.example.com、sh.example.com,城市间数据隔离。
- 目录模式:example.com/bj/、example.com/sh/,部署简单。
- 子站模式:每个城市一个独立织梦实例,维护成本高。
对于多数本地化站点,二级域名 + 单库多栏目的方案在 SEO 与运维间最为均衡。
二、城市栏目规划
1. 栏目层级设计
在织梦后台按城市建顶级栏目,下挂相同的业务子栏目,保证各城市结构一致便于模板复用:
北京(栏目ID 10)
├─ 公司动态
├─ 产品服务
└─ 联系我们
上海(栏目ID 11)
├─ 公司动态
├─ 产品服务
└─ 联系我们
2. 自定义字段存储城市信息
利用织梦自定义字段为每篇文档标记所属城市,便于跨栏目聚合。在“频道模型 → 自定义字段”中新增 city 字段,类型为下拉单选。
三、二级域名解析与绑定
1. 域名泛解析
在域名服务商处添加泛解析记录,将所有城市子域名指向同一服务器:
*.example.com → 服务器IP(A记录)
2. Nginx 配置通配符 server
server {
listen 80;
server_name ~^(?<city>.+)\.example\.com$;
root /www/wwwroot/example;
index index.html index.php;
# 将城市前缀传入 PHP
location / {
try_files $uri $uri/ /index.php?city=$city;
}
}
宝塔可在站点设置中添加泛域名绑定,无需手写 server_name 正则。
四、城市自动识别与模板切换
1. 入口文件识别城市
在 /include/common.inc.php 末尾加入城市识别逻辑,将二级域名前缀写入全局变量:
$host=$_SERVER['HTTP_HOST'];
if(preg_match('/^([a-z]+)\.example\.com$/i', $host, $m)){
$cfg_city=$m[1]; // bj / sh / gz
} else {
$cfg_city='www';
}
$GLOBALS['cfg_city']=$cfg_city;
2. 模板按城市加载
在模板目录下为每个城市建子目录,调用时动态拼接路径:
// 模板调用示例
$tpl="/templets/{$cfg_city}/list.htm";
$pv=new PartView();
$pv->SetTemplet($tpl);
$pv->Display();
五、城市数据隔离
1. 列表按城市过滤
在 arclist 调用中通过城市字段过滤,确保北京站只显示北京内容:
{dede:arclist typeid='10' addfields='city' channelid='1'}
[field:city runphp='yes']if(@me!=$GLOBALS['cfg_city'])@me='';[/field:city]
{/dede:arclist}
2. 公共内容共享
公司介绍、产品库等无地域属性的内容放在公共栏目,所有城市站统一调用,避免重复维护。
六、SEO 与多城市注意事项
- 避免镜像重复:各城市首页与列表页内容必须有差异,否则被判镜像降权。
- canonical 标注:每个城市站指向自身 canonical,防止跨城市重复收录。
- sitemap 分城市:为每个二级域名生成独立 sitemap 并分别提交。
- 本地化关键词:标题与描述中嵌入“城市+服务”组合词。
百度对多城市分站有专门审查,若各城市内容高度雷同仅替换城市名,可能被判为采集站群降权。
七、性能优化
多城市站点页面量大,建议开启静态生成并为每个城市单独生成目录,配合 CDN 按城市节点缓存,降低服务器压力。
城市数量超过 50 个时,单库方案会出现栏目膨胀,可考虑分库或引入城市配置表替代栏目。
多城市分站落地建议
多城市分站是本地化运营的有效手段,但成功的关键不在技术而在内容差异化。建议先用 3-5 个核心城市跑通流程,验证内容生产能力后再规模化扩展。每个城市配置专人或 AI 辅助产出本地新闻、本地案例,配合独立的客服与落地页,让分站真正具备本地服务能力,而非仅做城市关键词的流量入口,才能在搜索引擎与用户两端建立长期价值。