搜索全站
安装部署 16 分钟阅读

企业站多城市分站方案:子目录子域名选择与内容去重策略

多城市分站做不好会被判定为垃圾门页。本文对比子目录与子域名两种结构,给出 Multisite 与单站点两套实现方案,重点讲内容差异化的最低标准与 canonical、内链的处理方式。

U
UFO_PF 2023-02-05 · 阅读 16 分钟
企业 安装部署
阅读提示
本文约 6,088 字,预计阅读 16 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:做了十二个城市分站,被搜索引擎判成垃圾页

一家做本地服务的公司,为了覆盖十二个城市,用模板批量生成了十二个分站:页面结构完全一致,只把标题里的城市名替换掉,正文一字不差。上线两个月后,十二个分站里十一个从索引中消失,剩下主站也开始掉排名。

原因不难理解:这些页面对用户没有独立价值——除了城市名,内容和主站完全一样。搜索引擎把这类页面归类为 doorway pages(门页),判定标准是「是否为访客提供了超出 URL 差异的实质内容」。被判定后不只是分站消失,整站质量信号也会受牵连。

多城市分站本身是合理需求。连锁门店、本地服务、区域定价,都确实需要「上海分公司」「成都分公司」这样的落地页。关键在于两点:一是结构选对(子目录还是子域名),二是每个分站必须有真正的本地化内容,而不是靠替换城市名批量生成。

原理分析:两种结构的差异

维度 子目录(example.com/shanghai/) 子域名(sh.example.com)
权重继承 直接继承主域权重 需要重新积累
部署复杂度 低,同一套程序 高,需泛解析 + 多站点
Cookie / 会话 共享 需配置跨域
统计与运维 统一 分散
适用场景 绝大多数企业站 各城市独立运营、独立团队

结论很明确:企业站多城市分站优先用子目录。它能继承主域已有的权重,新分站从第一天起就有基础信任度;运维上也只是一套 WordPress 加一层路径。子域名适合各城市有独立运营团队、独立内容体系的连锁品牌,一般企业用不上。

实现层面有两条路:

方案 做法 优点 缺点
单站点 + 分类/CPT 用 city 分类法或重写规则生成路径 维护一套,内容可共享 各分站无法完全独立
WordPress Multisite WP_ALLOW_MULTISITE 开多站点 各分站独立后台、独立管理员 升级与插件管理复杂

判断标准:如果各分站内容高度重合(只是地址和电话不同),用单站点 + 分类法最合适,因为共享内容本来就该共享;如果各城市要独立发新闻、独立管理,才用 Multisite。

内容去重方面,可用的工具只有三个:canonical、内容差异化、内链组织。robots 屏蔽是错误做法——屏蔽后页面既不被收录也不传递权重,分站就白做了。

保姆级实操

步骤 1:单站点方案——用分类法生成城市路径

<?php
add_action( 'init', 'mmf_register_city' );
function mmf_register_city() {
    register_taxonomy( 'city', array( 'post', 'page', 'product', 'case' ), array(
        'labels'       => array( 'name' => '城市' ),
        'public'       => true,
        'hierarchical' => true,
        'rewrite'      => array( 'slug' => 'city', 'with_front' => false ),
        'show_in_rest' => true,
    ) );

    // 城市分站首页路径:/shanghai/
    add_rewrite_rule(
        '^([a-z]{2,12})/?$',
        'index.php?city=$matches[1]',
        'top'
    );
}

add_filter( 'query_vars', function( $vars ) {
    $vars[] = 'city';
    return $vars;
} );

更稳妥的做法是不用正则匹配所有短路径(会和普通页面 slug 冲突),而是显式注册城市:

<?php
add_action( 'init', 'mmf_city_rewrites' );
function mmf_city_rewrites() {
    $cities = array( 'shanghai', 'beijing', 'chengdu', 'guangzhou' );
    foreach ( $cities as $city ) {
        add_rewrite_rule(
            '^' . $city . '/?$',
            'index.php?city=' . $city,
            'top'
        );
    }
}

白名单式注册能避免 /about/ 这类正常页面被误判成城市。

步骤 2:用模板渲染城市分站

<?php
add_filter( 'template_include', 'mmf_city_template' );
function mmf_city_template( $template ) {
    $city = get_query_var( 'city' );
    if ( ! $city ) {
        return $template;
    }

    $found = get_template_directory() . '/city.php';
    if ( file_exists( $found ) ) {
        return $found;
    }
    return $template;
}

city.php 里输出该城市独有的内容:本地地址、本地电话、本地团队、本地案例、本地服务范围。

步骤 3:Multisite 方案的配置

<?php
// wp-config.php 里加一行,然后后台「工具 → 配置网络」
define( 'WP_ALLOW_MULTISITE', true );

配置网络时选择「子目录」模式,之后用 WP-CLI 批量建站:

wp site create --slug=shanghai --title="上海分公司"
wp site create --slug=chengdu  --title="成都分公司"

wp site list --fields=blog_id,url,last_updated

子域名模式还需要在 nginx 上配泛解析与通配符证书:

server {
    listen 443 ssl;
    server_name ~^(?<sub>.+)\.example\.com$;
    ssl_certificate     /etc/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/example.com/privkey.pem;

    root /var/www/example;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

Multisite 子目录模式下,WordPress 会在 wp_blogs 表里记录路径,nginx 不需要额外规则,这是它比子域名省事的地方。

步骤 4:内容差异化——这是分站成败的关键

每个分站至少要有以下「不可被批量生成」的内容:

必须独有的(每个城市都不同):
- 本地办公地址、本地联系电话、本地营业时间
- 本地团队介绍(人员姓名、照片、服务年限)
- 本地案例(该城市完成的项目,≥3 个)
- 本地服务范围 / 到货时效 / 本地政策差异

可以共享的(各城市一致):
- 产品参数、技术白皮书、通用解决方案描述
- 公司介绍、资质证书、发展历程
- 通用新闻(但应只出现在主站或一个指定分站)

一条实操判断法:把两个分站的页面并排放在一起,遮住城市名,如果内容读起来完全一样,那它就是门页,必须补充本地内容后再上线。

步骤 5:canonical 的处理

分站之间内容重合时,用 canonical 指向「最权威的那一版」:

<?php
add_action( 'wp_head', 'mmf_city_canonical', 5 );
function mmf_city_canonical() {
    // 通用内容页(如某个产品)统一 canonical 到主站版本
    if ( is_singular( 'product' ) ) {
        $canonical = get_permalink();
        echo '<link rel="canonical" href="' . esc_url( $canonical ) . '">' . "\n";
        return;
    }

    // 城市分站首页是独立内容,canonical 指向自己
    if ( get_query_var( 'city' ) ) {
        $canonical = home_url( '/' . get_query_var( 'city' ) . '/' );
        echo '<link rel="canonical" href="' . esc_url( $canonical ) . '">' . "\n";
    }
}

注意要先移除主题或 SEO 插件默认输出的 canonical,重复输出会导致两者都被忽略。用 remove_action( 'wp_head', 'rel_canonical' ) 处理。

步骤 6:内链与站点地图

<?php
// 页脚的城市切换器,用真实链接而非 JS
function mmf_city_switcher() {
    $cities = array(
        'shanghai' => '上海',
        'beijing'  => '北京',
        'chengdu'  => '成都',
    );
    $current = get_query_var( 'city' );

    echo '<nav class="city-switcher" aria-label="城市分站">';
    foreach ( $cities as $slug => $name ) {
        $class = ( $current === $slug ) ? ' class="is-current"' : '';
        printf(
            '<a href="%s"%s>%s</a>',
            esc_url( home_url( '/' . $slug . '/' ) ),
            $class,
            esc_html( $name )
        );
    }
    echo '</nav>';
}

城市切换器要放在全站页脚而非只放首页,这样每个页面都能被发现,形成完整的内部链接图。

步骤 7:上线前验证

# 确认每个分站 URL 可访问且返回 200
for c in shanghai beijing chengdu; do
  printf "%-10s " "$c"
  curl -s -o /dev/null -w "%{http_code}\n" "https://example.com/$c/"
done

# 确认 canonical 只出现一次
curl -s https://example.com/shanghai/ | grep -c 'rel="canonical"'

常见踩坑

  1. 批量生成内容一致的分站:被判定为 doorway pages,分站消失且牵连主站。这是最严重的一条。
  2. 用 robots.txt 屏蔽重复分站:页面不被收录也不传权重,等于白做,且屏蔽的页面仍可能被索引为「无摘要」结果。
  3. canonical 输出两次:主题输出一份、SEO 插件输出一份,搜索引擎会两条都不采信。
  4. 城市路径与页面 slug 冲突:用 ^([a-z]+)/?$ 这种贪婪规则会把 /about/ 判成城市。必须用城市白名单。
  5. 案例: 某连锁品牌做了 20 个城市分站,每个分站 8 个页面,其中 7 个是复制的主站内容,只有联系页不同。上线四个月后,Google 索引里只剩 20 个联系页,其余全部被剔除;主站的品牌词排名也从第一掉到第二页。整改方式是:把共享内容统一 canonical 到主站、分站只保留真正本地化的 3 个页面(本地案例、本地团队、联系方式),半年后逐步恢复。教训:宁可少做几个城市,也不要做没有本地内容的分站。
  6. Multisite 子域名模式忘了通配符证书:除主域外所有分站报证书错误。
  7. 分站和主站共用同一套站点地图而没有区分:应在站点地图里标明各 URL 的归属,并确保分站的本地化页面都在其中。

总结

多城市分站的技术选择很简单:优先子目录、优先单站点 + 城市分类法,只有在各城市需要独立运营时才上 Multisite。真正的难点在内容——每个分站必须有不可批量生成的本地内容(地址、电话、团队、本地案例),共享内容统一 canonical 到主站版本。

上线前用一句话检验:遮住城市名后,这个页面和主站还有区别吗?没有就不要上线。

分站涉及 URL 结构调整,务必按 主题切换对SEO的短期影响与应对 里的 URL 一致性流程做前后对比;如果采用 Multisite,各分站的主题与插件也要遵循 用WordPress做企业站的主题与插件组合 的「同一功能只留一个实现」原则,避免多站点环境下的管理失控。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。