WordPress 多域名配置:地址白名单与静态资源处理

WordPress 多域名配置:地址白名单与静态资源处理

WordPress 多域名配置教程

WordPress 通常以“WordPress 地址”和“站点地址”作为基准,其他域名解析到同一服务器后,可能被规范化到主域名。让几个域名显示同一套站点,可以研究动态地址配置,但不能据此保证它们互不影响。

下面保留单域名地址、多域名白名单和静态资源三个部分,并修正直接信任 Host 的问题。这种做法仍是同一个 WordPress 站点,不等于创建了多个独立站点,也不会自动解决跨域登录、SEO、插件和缓存兼容性。

1. 先理解地址常量和 Host

备份数据库和站点根目录的 wp-config.php,再编辑这个文件。配置应放在载入 wp-settings.php 之前;已有同名常量时应调整原定义,不能重复添加。

历史写法如下。为防止直接复制执行,这里将它放在注释中保留:

/* 历史片段:直接信任请求 Host,不应直接启用。
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
*/

HTTP_HOST 来自客户端请求头。域名解析到服务器,不代表该值已经被服务器信任;任意拼接会影响生成的链接、重定向及资源地址。上面还硬编码了 http,不能直接用于 HTTPS 站点。仅想增加别名时,通常在 Web 服务器把别名跳转到一个固定主域名更容易维护。

2. 多个域名使用明确白名单

确实需要保留多个访问域名时,先在 Web 服务器逐个绑定域名并配置覆盖它们的 TLS 证书;HTTP 到 HTTPS 的跳转使用受控目标,默认站点拒绝未知 Host。应用层再使用显式白名单映射到固定 HTTPS 地址,而不是把未经检查的 Host 拼进 URL:

// 仅适用于已在 Web 服务器绑定、证书覆盖的三个 HTTPS 域名。
// 将示例域名和完整 URL 改为你实际控制的域名。
$allowed_sites = array(
    'www.example.com' => 'https://www.example.com',
    'www.example.net' => 'https://www.example.net',
    'www.example.org' => 'https://www.example.org',
);

// 命令行任务采用明确的主站 URL,不从缺失的 HTTP 请求推断。
if (PHP_SAPI === 'cli') {
    $site_url = $allowed_sites['www.example.com'];
} else {
    $host = strtolower($_SERVER['HTTP_HOST'] ?? '');
    if (!array_key_exists($host, $allowed_sites)) {
        http_response_code(400);
        exit('Invalid host');
    }
    $site_url = $allowed_sites[$host];
}

define('WP_SITEURL', $site_url);
define('WP_HOME', $site_url);

这里只接受白名单里完全一致的主机名(大小写统一转为小写),没有允许任意端口、末尾点号或其他变形;需要这些形式时,应明确列出或在受控服务器层规范化。三个 example 域名只是示例,必须替换。这个示例假设 WordPress 核心和站点首页都在域名根目录;如果核心装在子目录,WP_SITEURL 还要加上对应目录,WP_HOME 则按实际首页地址设置。

历史片段使用 in_array 判断三个域名,但不匹配时只是没有定义常量,WordPress 仍可能使用数据库里的地址继续运行,所以“其他域名不能访问”并不成立。上面的修订明确返回错误并终止请求;服务器层仍应拒绝无关域名。命令行任务使用明确主站,避免 HTTP_HOST 不存在时出错。

若站点在反向代理后,由可信代理正确传递 HTTPS 状态,并限制上游来源;不要直接相信任意客户端提供的 X-Forwarded-Proto。这里把生成的地址固定为 HTTPS,但它本身不是强制 HTTPS 跳转规则。

3. 静态资源地址

历史示例把 WP_CONTENT_URL 设为 /wp-content。WordPress 官方配置说明要求使用该目录的完整 URL,因此根目录部署时可以沿用上面已经验证的站点地址:

// 放在上面的白名单配置之后;wp-content 路径按实际部署调整。
define('WP_CONTENT_URL', $site_url . '/wp-content');

这个常量只影响相关资源地址的生成,不会自动改写数据库里已保存的媒体、正文图片或插件配置中的绝对 URL,也不能保证所有主题和插件都适配相对路径或多域名。若使用 CDN 或独立资源域名,应填写自己的完整受控地址,不直接套用此段。

配置后逐域名检查首页、后台登录、退出、媒体上传、图片/脚本、REST API、邮件链接和缓存。不同注册域名之间不能简单共享普通登录 Cookie;搜索引擎也需要明确主域与规范链接。修改前准备好回退,不把“页面能打开”当作全部兼容性测试通过。

技术依据:WordPress 官方 wp-config.php 配置说明。文中代码仅作静态讲解,没有在具体线上站点执行。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容