1 前言
当我们使用wordpress来搭建自己的个人博客的时候,经常会遇到的一个问题就是需要使用多种方式来访问wordpress。比如,在内网,我想要使用内网地址192.168.x.x来访问,在外网,我想用域名bbs1.example.com来访问,或者我也想用bbs2.example.com来访问。这种需求其实非常正常和普遍,但是在默认的wordpress里却不能实现,因为默认情况下wordpress会绑定初始化时使用的访问地址(有可能是IP,也有可能是域名)。
其实吧,如果ssl解密这一步不是wordpress自己来做(现在通常的做法是如果有反向代理,那么就在反向代理上进行ssl解密),那么其实wordpress锁定一个访问地址这个动作从安全角度来说意义并不大,因为能够通过反向代理到达wordpress的请求的访问域名肯定都是正确的。
为了使wordpress能够支持多域名访问,总的来讲有3种实现方式。
2 方式一:修改wp-config.php
初始化wordpress时绑定的访问域名是存储在数据库中,具体位置在wordpress对应的库中的表wp_options中:

所以很多改wordpress访问域名或者IP或者http改成https之类失败后导致的无法访问wordpress的问题,是可以通过直接修改数据库中地址来修复的,其中,home和siteurl,分别对应WordPress地址和站点地址,如下图:

注:如果要用直接修改数据库这种方式,可以使用命令行,也可以使用各种数据库客户端(DBeaver,phpadmin等)直接进行修改,这里我就不多说了,网上有很多文章介绍,这个不是我今天要说的重点。
而我们这节要讲的修改wp-config.php的方法,利用的是WordPress 中,同一个设置数据,常量的优先级高于在数据库里面定义的变量的原理。WordPress 有WP_HOME 和 WP_SITEURL 这两个常量,分别对应数据库中的home和siteurl,所以只要在wp-config.php中设置这2个常量,就会优先于数据库中的设置生效,有以下2种修改思路。
1、全放开,不做任何限制
在wp-config.php文件中的define('WP_DEBUG', false);后面添加如下代码:
$scheme = 'http';
if (
isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'
) {
$scheme = 'https';
}
define('WP_SITEURL', $scheme . '://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', $scheme . '://' . $_SERVER['HTTP_HOST']);
这段代码实现的功能,就是根据反向代理传递的真实访问协议(HTTP/HTTPS)和当前 Host,动态设置 WordPress 站点地址,确保在 Cloudflare Tunnel 或者常规反向代理环境下生成正确的 URL。
当然,采用这种方式的前提是能够达到wordpress的请求都是正常请求,所以这种方式只能和反向代理配合使用,或者通过安全手段过滤达到wordpress上的非法域名请求。
2、直接限定能够访问wordpress的域名
在wp-config.php文件中的define('WP_DEBUG', false);后面添加如下代码:
$host = $_SERVER['HTTP_HOST'];
$allowed_hosts = [
'bbs1.example.com',
'bbs2.example.com',
'bbs3.example.com',
];
if (!in_array($host, $allowed_hosts)) {
$host = 'bbs1.example.com';
}
$scheme = (
isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'
) ? 'https' : 'http';
define('WP_SITEURL', $scheme . '://' . $host);
define('WP_HOME', $scheme . '://' . $host);
这段代码实现的功能,除了可以根据真实访问协议(HTTP/HTTPS)和当前 Host 动态设置 WordPress 站点地址以外,同时还通过 Host 白名单限制可接受的访问入口(比如上面代码中的bbs1.example.com,bbs2.example.com和bbs3.example.com,),防止非法 Host Header 导致WordPress 生成错误的 URL(如果是非法Host Header,则强制访问bbs1.example.com),适用于反向代理、多入口及直接部署等场景。
不过,需要注意的是,上面的2种方式对wordpress中的静态资源是无效的,例如上传到WP中的附件、图片等,如果要修改此类静态资源的地址,还需要插入如下代码:
define( 'WP_CONTENT_URL', '//' . $_SERVER['HTTP_HOST'] . '/wp-content');
注:采用修改wp-config.php的方式,会导致后台设置界面siteurl和home变为灰色无法修改:

不过并不影响正常使用,就是看着可能有点不爽。
3 方式2:修改当前主题的 function.php
方式2其实和方式1一样,都是采用的设置WP_HOME 和 WP_SITEURL 这两个常量的方式,只不过方式1是在wp-config.php中设置,而方式2是在当前主题的function.php中进行设置。设置的内容都是一样的,这里就不再赘述了。
4 方式3:插件
实现多域名访问的插件应该不少,我之前使用的是Multiple Domain:

使用起来非常简单,直接添加用来访问的域名即可,如下图:

这插件其实很不错,就是太久没更新了,强迫症的我表示很不爽,所以我后来就换成修改wp-config.php的方式。
注:用插件这种方式不会导致后台设置界面siteurl和home变为灰色。
5 总结
不同的方法并没有绝对的优劣,关键还是取决于自己的实际需求。
如果只是将网站整体迁移到新的域名,而不需要保留旧域名访问,那么直接修改数据库中的站点地址通常是最简单、最直接的方案。配置完成后,WordPress 就会以新的域名正常运行,后续也几乎不需要额外维护。
如果需要同时支持多个访问入口,例如多个域名、内网 IP、反向代理、Cloudflare Tunnel、Tailscale 等场景,那么通过插件,或者在 wp-config.php、functions.php 中动态设置 WP_HOME、WP_SITEURL 会更加灵活。这种方式能够根据访问入口自动生成对应的站点地址,更适合一些特殊部署环境。
需要注意的是,wp-config.php 和 functions.php 中的设置优先级高于数据库,因此它们不仅可以作为日常配置方案,也可以作为一种”应急手段”。例如,当数据库中的站点地址配置错误,或者插件导致后台无法正常访问时,临时在代码中覆盖 WP_HOME 和 WP_SITEURL,往往能够快速恢复网站访问,再进入后台继续处理其他问题。
需要再次强调一下:
如果多域名访问采用设置WP_HOME 和 WP_SITEURL 这两个常量的方式,建议不要直接信任 $_SERVER['HTTP_HOST'],而应结合 Host 白名单进行限制,并根据反向代理传递的真实访问协议(如 X-Forwarded-Proto)动态判断 HTTP/HTTPS。
这样既能兼顾多入口访问的灵活性,又能避免非法 Host Header 导致 WordPress 生成错误的站点 URL,在 VPS 直连、反向代理以及 Cloudflare Tunnel 等部署场景下都会更加安全、可靠。