搜索全站
数据库 16 分钟阅读

多域名指向同一 WordPress 的处理:规范域名与重定向统一

同时绑定 mimangfei.com 和 www.mimangfei.com,搜索引擎会当成两个站,权重分散。本文讲清规范域名选择、Nginx 301 统一、WordPress 侧设置和 canonical 标签的正确做法。

U
UFO_PF 2023-12-28 · 阅读 16 分钟
多域 数据库
阅读提示
本文约 6,191 字,预计阅读 16 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:四个域名其实是四个”站”

一个站点可能同时能通过这些地址访问:

  • http://mimangfei.com
  • http://www.mimangfei.com
  • https://mimangfei.com
  • https://www.mimangfei.com

对搜索引擎来说,这是四个独立的 URL,每个都能被索引。结果:

  • 同一篇文章被收录 4 次,判定为重复内容;
  • 外链分散到 4 个版本,权重被稀释;
  • 百度可能只挑一个收录,但挑的不一定是你想要的;
  • 更麻烦的是,如果你还绑了 m.mimangfei.com、blog.mimangfei.com 之类的,问题更严重。

解决思路:选一个规范域名(Canonical Domain),其他全部 301 重定向过去。

原理分析:301 与 canonical 的区别

手段 作用层 效果
301 重定向 HTTP 层 访客和爬虫直接跳转,其他版本不会再被访问到。最强手段 ✅
rel="canonical" HTML 层 告诉爬虫”这个页面的规范版本是那个”,但页面仍可访问。用于无法 301 的场景
robots.txt 禁止 爬虫层 阻止抓取,但已收录的不会被合并,且禁爬后权重无法传递。不推荐单独用

结论:能用 301 就别只用 canonical。301 会传递 90%+ 的权重,canonical 只是建议。

选哪个做规范域名:

  • https://mimangfei.com(不带 www):简短,现代趋势;
  • https://www.mimangfei.com(带 www):传统,cookie 作用域更灵活,CNAME 配置更方便。

两者 SEO 上没有优劣,关键是全站统一。选好后不要再改(改规范域名 = 全站 301,会有短暂波动)。

特殊情况:如果用了 CDN,通常推荐带 www(因为根域名不能 CNAME),但现在阿里云/腾讯云/Cloudflare 都支持 CNAME flattening(ALIAS/ANAME),根域名也能 CNAME,所以不是限制。

保姆级实操

第一步:确定规范域名并配置 301

假设规范域名是 https://www.mimangfei.com。

Nginx 配置(推荐写法,用独立 server 块)

# 1) HTTP 全部跳转到 HTTPS + www
server {
    listen 80;
    listen [::]:80;
    server_name mimangfei.com www.mimangfei.com;

    # Let's Encrypt 验证路径要放行
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    return 301 https://www.mimangfei.com$request_uri;
}

# 2) HTTPS 不带 www → 带 www
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name mimangfei.com;

    ssl_certificate     /etc/letsencrypt/live/mimangfei.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mimangfei.com/privkey.pem;

    return 301 https://www.mimangfei.com$request_uri;
}

# 3) 正式站点
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.mimangfei.com;

    ssl_certificate     /etc/letsencrypt/live/mimangfei.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mimangfei.com/privkey.pem;

    root /var/www/mimangfei;
    index index.php index.html;

    # HSTS(可选,但配了就别轻易取消)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

要点:

  • $request_uri 保留完整路径和参数,保证 /abc?x=1 跳到 /abc?x=1 而不是首页;
  • 证书必须同时包含 mimangfei.com 和 www.mimangfei.com(SAN),否则 HTTPS 跳转前会报证书错误;
  • 用 return 301 而不是 rewrite ... permanent,性能更好、语义更清晰。
sudo nginx -t && sudo systemctl reload nginx

验证:

curl -I http://mimangfei.com/
# HTTP/1.1 301 Moved Permanently
# Location: https://www.mimangfei.com/

curl -I https://mimangfei.com/some-page/
# Location: https://www.mimangfei.com/some-page/    ← 路径保留

curl -sIL https://www.mimangfei.com/ | grep -E "^HTTP|^location"
# 应该只有 200,没有多余跳转

Apache 写法(.htaccess)

RewriteEngine On
# HTTP → HTTPS + www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.mimangfei.com%{REQUEST_URI} [L,R=301]

第二步:WordPress 侧设置

后台「设置 – 常规」两个字段都要填规范域名:

WordPress 地址(URL):https://www.mimangfei.com
站点地址(URL):    https://www.mimangfei.com

或用命令行:

wp option update home 'https://www.mimangfei.com' --allow-root
wp option update siteurl 'https://www.mimangfei.com' --allow-root

注意:如果 WordPress 的站点地址和实际访问域名不一致,WordPress 会自动 301 跳转到站点地址(这是它的内置行为)。所以即使 Nginx 没配,也不会两个版本都能访问——但依赖 WordPress 跳转意味着每个请求都要先跑 PHP,性能和可靠性都不如 Nginx 层处理。所以两层都要配一致。

第三步:数据库中的历史 URL

老文章正文里可能硬编码了旧域名(比如图床地址、内链):

wp search-replace 'http://mimangfei.com' 'https://www.mimangfei.com' --dry-run --allow-root
wp search-replace 'https://mimangfei.com' 'https://www.mimangfei.com' --dry-run --allow-root

确认无误后去掉 --dry-run。详见WP-CLI search-replace 批量替换域名。

第四步:canonical 标签作为补充

即使做了 301,也建议保留 canonical 标签(Yoast SEO、Rank Math、SEOPress 会自动生成):

<link rel="canonical" href="https://www.mimangfei.com/some-article/" />

手工添加(无 SEO 插件时):

// 主题 functions.php
add_action( 'wp_head', function() {
    if ( is_singular() ) {
        printf( '<link rel="canonical" href="%s" />' . "\n", esc_url( get_permalink() ) );
    } elseif ( is_home() ) {
        printf( '<link rel="canonical" href="%s" />' . "\n", esc_url( home_url( '/' ) ) );
    }
}, 1 );

注意:如果装了多个 SEO 插件,可能出现两个 canonical 标签,搜索引擎会忽略或困惑。确保只有一个插件负责输出。

第五步:处理其他多余域名

如果还绑了别的(如 m.mimangfei.com、旧域名 old-domain.com、IP 直接访问):

# 旧域名整站 301(保留路径)
server {
    listen 80;
    listen 443 ssl;
    server_name old-domain.com www.old-domain.com;
    ssl_certificate     /path/to/old.pem;
    ssl_certificate_key /path/to/old.key;
    return 301 https://www.mimangfei.com$request_uri;
}

# IP 直接访问 → 拒绝或跳转
server {
    listen 80 default_server;
    server_name _;
    return 444;   # Nginx 特有,直接断开连接
}

移动端子域名:如果做了 m. 子域,规范做法是:

  • 同一 URL 返回不同内容(响应式):加 Vary: User-Agent;
  • 不同 URL(m. 子域):主站加 <link rel="alternate" media="..." href="m站URL">,m 站加 rel="canonical" 指向主站。

第六步:提交给搜索引擎

  1. 在百度站长平台验证所有版本(带 www 和不带 www),然后在「网站属性设置」里设置首选域;
  2. 在 Google Search Console 添加域名属性(Domain property,覆盖所有子域和协议);
  3. 提交 sitemap,sitemap 里的 URL 必须是规范域名;
  4. 用「抓取诊断」验证 301 是否生效。

常见踩坑

  1. 重定向链:http://mimangfei.com → http://www.mimangfei.com → https://www.mimangfei.com,中间多一跳。一步到位跳到最终地址(上面配置就是这么写的)。
  2. 重定向循环:最常见的错误。典型原因是前置了 CDN/反向代理,WordPress 以为自己是 HTTP,一直跳 HTTPS。解决见反向代理下获取真实 IP里的 X-Forwarded-Proto 处理。
  3. 证书只包含 www:访问 https://mimangfei.com 时先报证书警告(浏览器会拦截),用户根本到不了 301。证书必须包含所有绑定的域名。申请时:

bash
sudo certbot certonly --webroot -w /var/www/certbot \
-d mimangfei.com -d www.mimangfei.com

  1. 案例:某站把 mimangfei.com 301 到 www.mimangfei.com,但 nginx -s reload 之后没生效。排查发现还有其他配置文件也定义了 server_name mimangfei.com,Nginx 按文件名顺序优先匹配了另一个。用 nginx -T | grep server_name 检查所有 server 块。
  2. WordPress 站点地址没改:Nginx 301 做好了但 WordPress 里还是旧地址,后台进不去或前台资源 404。两个都要改。
  3. CDN 缓存了 301:切换规范域名后必须刷新 CDN。而且注意 CDN 有可能缓存了”重定向前的版本”。
  4. 改了规范域名后收录波动:正常,301 需要几周到几个月完成权重传递。不要频繁更改,改一次就定下来。

总结

多域名统一的核心动作:选定一个规范域名 → Nginx 层把所有其他版本 301 过去(一步到位,保留 $request_uri)→ WordPress 的 home/siteurl 同步 → 数据库历史 URL 替换 → 保留 canonical 标签 → 站长平台设置首选域。验证手段是 curl -I 逐条检查,确保没有多重跳转和循环。这一步做了,配合 sitemap 提交(参考后续百度 SEO / Google SEO 系列文章),收录效率会有明显改善。更换域名涉及的批量替换操作,见WP-CLI search-replace 批量替换域名。

U
UFO_PF作者

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

留下你的想法

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