帮我把下面的代码精简下 当我们把个人blog搭建在自己的nas或

明白了!以下是精简后的文章内容,去掉了不必要的标签和冗余信息,保留了核心问题和解决方案:


问题背景

当我们将个人博客搭建在 NAS 或软路由上,并通过 Cloudflare Zero Trust 或其他工具进行内网穿透以便公网访问时,可能会遇到以下两个问题:

  1. 内网穿透下的地址冲突
    使用内网穿透将本地的 WordPress 服务暴露到公网时,如果同时希望通过内网 IP 访问后台,会遇到 WordPress 主站地址冲突的问题。WordPress 无法确定是将内网 IP 还是公网域名作为主站地址。

  2. HTTPS 协议下无法登录管理后台
    使用 HTTPS 协议访问 WordPress 时,可能会遇到无法登录管理后台的问题。


解决方案

1. 内网穿透下的地址冲突

WordPress 有两个重要参数:WordPress 地址站点地址。通常情况下,这两个值是相同的。如果希望通过外网域名和内网 IP 同时访问,可以通过修改 wp-config.php 文件动态设置这两个参数。

wp-config.php 中添加以下代码:

1
2
3
$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_SITEURLWP_HOME,避免地址冲突。

2. HTTPS 登录管理后台

当使用 HTTPS 访问 WordPress 时,可能会遇到无法登录管理后台的问题。这是因为 WordPress 默认未强制启用 SSL。可以通过修改 wp-config.php 文件强制开启 SSL 访问。

wp-config.php 中添加以下代码:

1
2
3
$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

代码说明

  • 强制将 $_SERVER['HTTPS'] 设置为 on,确保 WordPress 识别 HTTPS 协议。
  • 启用 FORCE_SSL_LOGINFORCE_SSL_ADMIN,强制后台使用 HTTPS 登录。

综合解决方案

如果既需要通过 HTTPS 登录后台,又需要保留内网 IP 访问的能力,可以将上述代码结合使用:

1
2
3
4
5
6
7
8
9
10
11
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 文件的最下方即可。


这样精简后的内容更加清晰,去掉了冗余的标签和解释,直接聚焦于问题和解决方案。

时间: 2025-02-26T21:22:19


👤 用户

帮我把下面的代码精简下
当我们把个人blog搭建在自己的nas或者软路由上,通过cloudflare的zerotrust或者其他工具进行内网穿以便公网访问你时会遇到下面两个问题。

  • 如果我们使用内网穿透把本地的 wordpress 服务穿透到公网上,同时希望仍能用内网 ip 访问后台的话,会遇到 wordpress 主站地址冲突的问题,即 wordpress 不知道要把内网 ip 当作地址还是把公网访问用的域名当作地址;
  • 如果我们使用 https 协议访问 wordpress 会遇到无法登录进管理后台的问题。

内网穿透下的地址冲突

wordpress 会有两个重要参数 wordpress 地址站点地址,大部分情况下个人网站两个值是一样的,此处不分别处理。 这个值是可以手动修改的,所以如果我们只希望通过一种方式(ip / 域名)访问,那么我们修改一下就好。如果我们希望既可以在外网用域名访问,同时希望还可以在内网用 ip 访问的话,就要求 wordpress 可以通过访问方式,自动的调整两个参数。 一般情况下,大部分解决方案是在wp-config.php文件里添加下面两行:
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
很好理解,就是在配置文件里把访问地址直接写进两个参数内(直接写值会导致后台页面参数变灰,不可更改),这样问题就解决了,但是此种方法下 wordpress 会把 https 协议的域名也当作 http 处理。这会导致一些图片无法加载。 此种情况下,我们还要分辨是使用了 http 还是 https 协议。 识别协议可以使用 php 函数$_SERVER['HTTPS']
$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
用这个方法分辨后再去 define url 似乎也可以,可是我的情况更恼人一些,由于我是用 cloudflare的zerotrust服务进行了内网穿透,我的本地 wordpress 服务是没配置 https 访问的,但是我的内网穿透服务器强行配置了 https 访问。这导致虽然用户是通过https://domain.com访问的博客,但是本地的 wordpress 感受不到,它仍然认为是通过http://domain.com访问的。这是因为协议头是逐跳标头,只能逐级传递不能跳传,所以 https 的信息传到内网穿透服务器就不再向下传了。
这种情况下,$_SERVER['HTTPS']是无法分辨的。所以只能另辟蹊径,用访问字头是数字还是非数字来判断是通过 ip 还是域名访问的,如果是 ip 访问,那就加上 http ;如果是域名那就加上 https,就有了下面代码。
if(is_numeric(substr($_SERVER['HTTP_HOST'],0,1)))	# is_numeric 判断是数字还是非数字
{
        $http_type = 'http://';
}
else
{
        $http_type = 'https://';
}

define(‘WP_SITEURL’, $http_type . $_SERVER[‘HTTP_HOST’]);
define(‘WP_HOME’, $http_type . $_SERVER[‘HTTP_HOST’]);

https 登录管理后台

当使用 https 访问 wordpress 时,虽然访问页面是没问题的,但是发现管理后台怎么也登陆不进去,这是因为wp-config.php还有一个地方需要修改,添加下面的语句,强制开启ssl访问。
$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
这样就可以 https 登录后台了。

总结

结合上面的分析,我的情况是既要 https 登陆后台,也要保留内网 ip 操作的能力。所以不能武断把两段代码一起插进去,而要结合一起,ip 访问时,不开启 https 登录;域名访问是开启 https 登录。在wp-config.php最下方添加如下代码:
if(is_numeric(substr($_SERVER['HTTP_HOST'],0,1)))
{
        $http_type = 'http://';
}
else
{
        $http_type = 'https://';

	<span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTPS'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'on'</span><span class="token punctuation">;</span>
	<span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'FORCE_SSL_LOGIN'</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'FORCE_SSL_ADMIN'</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

}

define(‘WP_SITEURL’, $http_type . $_SERVER[‘HTTP_HOST’]);
define(‘WP_HOME’, $http_type . $_SERVER[‘HTTP_HOST’]);

时间: 2025-02-26T21:20:53


🤖 DeepSeek (deepseek-chat)

你可以将代码精简如下:

1
2
3
4
5
6
7
8
9
10
$http_type = is_numeric(substr($_SERVER['HTTP_HOST'], 0, 1)) ? 'http://' : 'https://';

if ($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']);

解释:

  1. 简化判断逻辑:使用三元运算符简化了 if-else 判断,直接根据 HTTP_HOST 的第一个字符是否为数字来决定使用 http:// 还是 https://
  2. 合并定义:将 WP_SITEURLWP_HOME 的定义合并在一起,减少重复代码。
  3. 条件开启 HTTPS:只有在使用 https:// 时才开启 FORCE_SSL_LOGINFORCE_SSL_ADMIN,避免不必要的配置。

这样代码更加简洁,逻辑也更加清晰。

时间: 2025-02-26T21:20:53


👤 用户

不是,你误会我的意思了。。我是需要把上面的那些杂乱的文章内容代码给精简一下,太乱了。去掉一些不必要的标签

时间: 2025-02-26T21:22:19


🤖 DeepSeek (deepseek-chat)

明白了!以下是精简后的文章内容,去掉了不必要的标签和冗余信息,保留了核心问题和解决方案:


问题背景

当我们将个人博客搭建在 NAS 或软路由上,并通过 Cloudflare Zero Trust 或其他工具进行内网穿透以便公网访问时,可能会遇到以下两个问题:

  1. 内网穿透下的地址冲突
    使用内网穿透将本地的 WordPress 服务暴露到公网时,如果同时希望通过内网 IP 访问后台,会遇到 WordPress 主站地址冲突的问题。WordPress 无法确定是将内网 IP 还是公网域名作为主站地址。

  2. HTTPS 协议下无法登录管理后台
    使用 HTTPS 协议访问 WordPress 时,可能会遇到无法登录管理后台的问题。


解决方案

1. 内网穿透下的地址冲突

WordPress 有两个重要参数:WordPress 地址站点地址。通常情况下,这两个值是相同的。如果希望通过外网域名和内网 IP 同时访问,可以通过修改 wp-config.php 文件动态设置这两个参数。

wp-config.php 中添加以下代码:

1
2
3
$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_SITEURLWP_HOME,避免地址冲突。

2. HTTPS 登录管理后台

当使用 HTTPS 访问 WordPress 时,可能会遇到无法登录管理后台的问题。这是因为 WordPress 默认未强制启用 SSL。可以通过修改 wp-config.php 文件强制开启 SSL 访问。

wp-config.php 中添加以下代码:

1
2
3
$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

代码说明

  • 强制将 $_SERVER['HTTPS'] 设置为 on,确保 WordPress 识别 HTTPS 协议。
  • 启用 FORCE_SSL_LOGINFORCE_SSL_ADMIN,强制后台使用 HTTPS 登录。

综合解决方案

如果既需要通过 HTTPS 登录后台,又需要保留内网 IP 访问的能力,可以将上述代码结合使用:

1
2
3
4
5
6
7
8
9
10
11
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 文件的最下方即可。


这样精简后的内容更加清晰,去掉了冗余的标签和解释,直接聚焦于问题和解决方案。

时间: 2025-02-26T21:22:19



对话统计

  • 消息总数: 4 条
  • 处理状态: 成功转换