问题背景
当我们将个人博客搭建在 NAS 或软路由上,并通过 Cloudflare Zero Trust 或其他工具进行内网穿透以便公网访问时,可能会遇到以下两个问题:
-
内网穿透下的地址冲突
使用内网穿透将本地的 WordPress 服务暴露到公网时,如果同时希望通过内网 IP 访问后台,会遇到 WordPress 主站地址冲突的问题。WordPress 无法确定是将内网 IP 还是公网域名作为主站地址。 -
HTTPS 协议下无法登录管理后台
使用 HTTPS 协议访问 WordPress 时,可能会遇到无法登录管理后台的问题。
解决方案
1. 内网穿透下的地址冲突
WordPress 有两个重要参数:WordPress 地址 和 站点地址。通常情况下,这两个值是相同的。如果希望通过外网域名和内网 IP 同时访问,可以通过修改 wp-config.php
文件动态设置这两个参数。
在 wp-config.php
中添加以下代码:
$http_type = is_numeric(substr($_SERVER['HTTP_HOST'], 0, 1)) ? 'http://' : 'https://';
define('WP_SITEURL', $http_type . $_SERVER['HTTP_HOST']);
define('WP_HOME', $http_type . $_SERVER['HTTP_HOST']);
代码说明:
- 通过
is_numeric
判断访问地址的第一个字符是否为数字(即是否为 IP 地址)。 - 如果是 IP 地址,使用
http://
;如果是域名,使用https://
。 - 动态设置
WP_SITEURL
和WP_HOME
,避免地址冲突。
2. HTTPS 登录管理后台
当使用 HTTPS 访问 WordPress 时,可能会遇到无法登录管理后台的问题。这是因为 WordPress 默认未强制启用 SSL。可以通过修改 wp-config.php
文件强制开启 SSL 访问。
在 wp-config.php
中添加以下代码:
$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
代码说明:
- 强制将
$_SERVER['HTTPS']
设置为on
,确保 WordPress 识别 HTTPS 协议。 - 启用
FORCE_SSL_LOGIN
和FORCE_SSL_ADMIN
,强制后台使用 HTTPS 登录。
综合解决方案
如果既需要通过 HTTPS 登录后台,又需要保留内网 IP 访问的能力,可以将上述代码结合使用:
if (is_numeric(substr($_SERVER['HTTP_HOST'], 0, 1))) {
$http_type = 'http://';
} else {
$http_type = 'https://';
$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
}
define('WP_SITEURL', $http_type . $_SERVER['HTTP_HOST']);
define('WP_HOME', $http_type . $_SERVER['HTTP_HOST']);
代码说明:
- 如果是内网 IP 访问,使用
http://
,不强制 HTTPS。 - 如果是域名访问,使用
https://
,并强制开启 HTTPS 登录。
总结
通过上述方法,可以解决内网穿透下的地址冲突问题,并确保 HTTPS 协议下能够正常登录 WordPress 管理后台。将代码添加到 wp-config.php
文件的最下方即可。