一、多域名绑定的应用场景
在 WordPress 站点运营中,多域名绑定是常见需求,主要应用场景包括:
- 品牌保护:注册不同后缀的域名,防止品牌被抢注
- 市场推广:不同地区使用不同域名
- 移动端适配:m.xxx.com 用于移动端
- 多语言站点:en.domain.com, cn.domain.com
- 新旧域名切换:平滑过渡期
二、准备工作
1. 域名解析设置
在所有需要绑定的域名DNS中,将A记录指向您的服务器IP地址。
主域名.com A记录 服务器IP
www.主域名.com A记录 服务器IP
二级域名.com A记录 服务器IP
别名域名.com A记录 服务器IP
2. 服务器配置检查
确保服务器(Apache/Nginx)支持多域名配置。
三、方法一:通过 WordPress 设置(最简单)
1. 修改 wp-config.php
// 在 wp-config.php 中添加
define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
2. 修改数据库中的站点地址
在 wp_options表中修改:
siteurl为https://主域名.comhome为https://主域名.com
3. 使用插件自动处理
安装并激活 “WordPress MU Domain Mapping” 插件,适合多站点。
四、方法二:通过 .htaccess 文件重定向(Apache)
1. 强制使用主域名
# 强制所有域名重定向到主域名
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?其他域名\.com$ [NC]
RewriteRule ^(.*)$ https://主域名.com/$1 [R=301,L]
2. 多域名共存,不重定向
# 允许所有配置的域名访问
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?(主域名\.com|其他域名\.com|二级域名\.com)$ [NC]
RewriteRule ^ - [L]
3. 根据不同域名显示不同内容
# 根据域名设置不同的环境变量
RewriteCond %{HTTP_HOST} ^mobile\.domain\.com$ [NC]
RewriteRule ^ - [E=SITE_VERSION:mobile]
RewriteCond %{HTTP_HOST} ^desktop\.domain\.com$ [NC]
RewriteRule ^ - [E=SITE_VERSION:desktop]
五、方法三:通过 Nginx 配置
1. 基本多域名配置
server {
listen 80;
server_name 主域名.com www.主域名.com 其他域名.com www.其他域名.com;
root /var/www/wordpress;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
2. 301重定向到主域名
server {
listen 80;
server_name 其他域名.com www.其他域名.com;
return 301 https://主域名.com$request_uri;
}
六、方法四:通过 WordPress 多站点(Multisite)
1. 开启多站点功能
在 wp-config.php中添加:
define('WP_ALLOW_MULTISITE', true);
2. 安装后访问 工具 → 网络设置
选择子域名或子目录安装。
3. 配置网络设置
生成的 .htaccess内容:
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
4. 安装域映射插件
- 安装 “WordPress MU Domain Mapping” 插件
- 在
wp-config.php中添加:
define('SUNRISE', 'on');
- 在
wp-content/sunrise.php中添加(如果没有则创建):
<?php
// 域映射功能
七、方法五:通过代码动态处理
1. 在主题 functions.php 中处理
/**
* 多域名支持
*/
add_action('init', 'handle_multiple_domains');
function handle_multiple_domains() {
$current_domain = $_SERVER['HTTP_HOST'];
$primary_domain = '主域名.com';
// 允许访问的域名列表
$allowed_domains = array(
'主域名.com',
'www.主域名.com',
'其他域名.com',
'www.其他域名.com',
'二级域名.com',
);
// 如果不是允许的域名,重定向到主域名
if (!in_array($current_domain, $allowed_domains) && !defined('WP_CLI')) {
wp_redirect('https://' . $primary_domain . $_SERVER['REQUEST_URI'], 301);
exit;
}
// 动态设置站点URL
if (!is_admin()) {
add_filter('site_url', 'dynamic_site_url', 10, 4);
add_filter('home_url', 'dynamic_home_url', 10, 4);
}
}
function dynamic_site_url($url, $path, $scheme, $blog_id) {
return dynamic_domain_replace($url);
}
function dynamic_home_url($url, $path, $scheme, $blog_id) {
return dynamic_domain_replace($url);
}
function dynamic_domain_replace($url) {
$primary_domain = '主域名.com';
$current_domain = $_SERVER['HTTP_HOST'];
// 如果不是主域名,替换为当前访问域名
if ($current_domain !== $primary_domain && strpos($url, $primary_domain) !== false) {
$url = str_replace($primary_domain, $current_domain, $url);
}
return $url;
}
2. 根据域名加载不同内容
/**
* 根据域名显示不同内容
*/
add_action('template_redirect', 'domain_specific_content');
function domain_specific_content() {
$current_domain = $_SERVER['HTTP_HOST'];
switch ($current_domain) {
case 'shop.domain.com':
// 商城版本
add_filter('theme_mods', 'shop_theme_mods');
break;
case 'blog.domain.com':
// 博客版本
add_filter('pre_option_blogname', function() {
return '专业博客 - 域名B';
});
break;
case 'mobile.domain.com':
// 移动端版本
add_filter('stylesheet', function() {
return 'mobile-theme';
});
break;
}
}
八、方法六:通过插件实现
1. 推荐插件
- Multisite Domain Mapping – 多站点域映射
- WP Multisite Domain Mapping – 专业域映射
- Domain Mapping System – 商业解决方案
- Multiple Domains – 简单多域名
2. Multiple Domains 插件示例
// 插件配置示例
$domains = array(
'primary-domain.com',
'secondary-domain.com',
'tertiary-domain.com',
);
// 自动检测并应用对应设置
foreach ($domains as $domain) {
if ($_SERVER['HTTP_HOST'] === $domain) {
define('DOMAIN_CURRENT_SITE', $domain);
break;
}
}
九、SEO 优化处理
1. 规范链接设置
// 在 header.php 中添加
<link rel="canonical" href="<?php
$canonical_url = 'https://主域名.com';
if (is_single() || is_page()) {
$canonical_url .= $_SERVER['REQUEST_URI'];
} else if (is_category() || is_tag()) {
$canonical_url .= '/category/' . get_queried_object()->slug;
}
echo esc_url($canonical_url);
?>" />
2. 多域名 SEO 插件配置
// 使用 Yoast SEO 多域名支持
add_filter('wpseo_canonical', 'multi_domain_canonical');
add_filter('wpseo_opengraph_url', 'multi_domain_og_url');
function multi_domain_canonical($canonical) {
$primary_domain = '主域名.com';
$current_domain = $_SERVER['HTTP_HOST'];
if (strpos($canonical, $primary_domain) !== false) {
$canonical = str_replace($primary_domain, $current_domain, $canonical);
}
return $canonical;
}
十、SSL/HTTPS 配置
1. 多域名 SSL 证书
- 使用通配符证书:*.domain.com
- 使用多域名证书(SAN证书)
- Let’s Encrypt 免费多域名证书
2. 强制 HTTPS
// 在 wp-config.php 中
define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);
// 在 .htaccess 中
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
十一、缓存和 CDN 配置
1. 多域名缓存配置
// 根据域名设置不同的缓存键
add_filter('rocket_cache_query_strings', 'multi_domain_cache_keys');
function multi_domain_cache_keys($query_strings) {
$domain = $_SERVER['HTTP_HOST'];
$query_strings[] = 'domain=' . md5($domain);
return $query_strings;
}
2. Cloudflare 多域名设置
# 在 .htaccess 中处理 Cloudflare
<IfModule mod_cloudflare.c>
# 允许多域名
Cloudflare_Enable on
</IfModule>
十二、数据库处理
1. 序列化数据修复
// 替换数据库中的域名
function replace_domain_in_database($old_domain, $new_domain) {
global $wpdb;
$tables = array(
$wpdb->posts,
$wpdb->postmeta,
$wpdb->options,
$wpdb->comments,
$wpdb->commentmeta,
);
foreach ($tables as $table) {
$wpdb->query(
$wpdb->prepare(
"UPDATE {$table}
SET option_value = REPLACE(option_value, %s, %s)
WHERE option_value LIKE %s",
$old_domain,
$new_domain,
'%' . $wpdb->esc_like($old_domain) . '%'
)
);
}
}
2. 使用 Search & Replace 插件
推荐使用 “Better Search Replace” 插件安全替换域名。
十三、完整示例配置
完整的 wp-config.php 配置
<?php
// 多域名支持配置
$current_domain = $_SERVER['HTTP_HOST'];
// 允许的域名列表
$allowed_domains = array(
'primary.com',
'www.primary.com',
'secondary.com',
'www.secondary.com',
'cn.primary.com',
'en.primary.com',
);
// 主域名
define('PRIMARY_DOMAIN', 'primary.com');
// 如果是未授权的域名,重定向到主域名
if (!in_array($current_domain, $allowed_domains) && !defined('WP_CLI')) {
header('Location: https://' . PRIMARY_DOMAIN . $_SERVER['REQUEST_URI'], true, 301);
exit;
}
// 动态设置 WordPress 地址
define('WP_SITEURL', 'https://' . $current_domain);
define('WP_HOME', 'https://' . $current_domain);
// Cookie 域名设置
define('COOKIE_DOMAIN', $current_domain);
// 标准 WordPress 配置
define('DB_NAME', 'database_name');
define('DB_USER', 'database_user');
define('DB_PASSWORD', 'database_password');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
// 安全密钥
// ... 其他标准配置
完整的 .htaccess 配置
# BEGIN WordPress
RewriteEngine On
RewriteBase /
# 允许的域名
RewriteCond %{HTTP_HOST} ^(www\.)?primary\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)?secondary\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)?tertiary\.com$ [NC]
RewriteRule ^ - [L]
# 其他域名重定向到主域名
RewriteCond %{HTTP_HOST} !^(www\.)?primary\.com$ [NC]
RewriteCond %{HTTP_HOST} !^(www\.)?secondary\.com$ [NC]
RewriteCond %{HTTP_HOST} !^(www\.)?tertiary\.com$ [NC]
RewriteRule ^(.*)$ https://primary.com/$1 [R=301,L]
# 强制 HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# WordPress 标准重写规则
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
十四、测试和验证
1. 测试步骤
- DNS 解析测试:
ping 域名.com - SSL 证书测试:https://www.ssllabs.com/ssltest/
- 重定向测试:访问各域名检查是否正确跳转
- 链接测试:检查站内链接是否正常
- SEO 测试:检查规范链接和 meta 标签
2. 验证脚本
<?php
// 验证多域名配置
$domains_to_test = array(
'https://primary.com',
'https://www.primary.com',
'https://secondary.com',
'https://www.secondary.com',
);
foreach ($domains_to_test as $domain) {
$ch = curl_init($domain);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "域名: {$domain} - 状态码: {$http_code}";
if (strpos($response, '主站点标题') !== false) {
echo " - 内容正确\n";
} else {
echo " - 内容异常\n";
}
curl_close($ch);
}
十五、常见问题解决
1. 混合内容警告
// 在 functions.php 中修复混合内容
add_action('template_redirect', 'force_ssl_for_all');
function force_ssl_for_all() {
if (!is_ssl()) {
wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301);
exit();
}
}
2. 登录问题
// 修复多域名登录问题
add_filter('auth_cookie', 'multi_domain_auth_cookie', 10, 3);
function multi_domain_auth_cookie($cookie, $user_id, $remember) {
$domain = $_SERVER['HTTP_HOST'];
$cookie['domain'] = $domain;
return $cookie;
}
3. 缓存问题
// 清除多域名缓存
add_action('save_post', 'clear_multi_domain_cache');
function clear_multi_domain_cache($post_id) {
$domains = array('domain1.com', 'domain2.com', 'domain3.com');
foreach ($domains as $domain) {
// 清除各域名缓存
wp_remote_get("https://{$domain}/wp-json/wp/v2/posts/{$post_id}");
}
}
十六、最佳实践建议
- 选择一个主域名:用于搜索引擎收录
- 301重定向:其他域名301到主域名
- 统一内容:所有域名显示相同内容
- SSL证书:为所有域名配置SSL
- 定期检查:定期验证所有域名可访问性
- 监控设置:设置域名过期监控
- 备份配置:备份多域名相关配置
总结
WordPress 多域名绑定有多种实现方式,从简单的 .htaccess重定向到复杂的多站点配置,您可以根据实际需求选择合适的方法。对于大多数用户,推荐使用方法一(修改 wp-config.php)结合重定向规则,这样既简单又有效。对于企业级应用,考虑使用多站点配合域映射插件。
无论选择哪种方法,都要注意SEO优化、SSL配置和缓存处理,确保多域名配置不会影响网站性能和搜索引擎排名。


湘公网安备43020002000238