内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题

内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题

同步发布在个人笔记内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题

笔记记录解决两个 wordpress 相关问题

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

内网穿透下的地址冲突

wordpress 会有两个重要参数 wordpress 地址 ,站点地址 ,大部分情况下个人网站两个值是一样的,此处不分别处理。

这个值是可以手动修改的,所以如果我们只希望通过一种方式(ip / 域名)访问,那么我们修改一下就好。如果我们希望既可以在外网用域名访问,同时希望还可以在内网用 ip 访问的话,就要求 wordpress 可以通过访问方式,自动的调整两个参数。

一般情况下,大部分解决方案是在wp-config.php文件里添加下面两行:

php 复制代码
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);

很好理解,就是在配置文件里把访问地址直接写进两个参数内(直接写值会导致后台页面参数变灰,不可更改)。简单情况下,这样问题就解决了,但是此种方法下 wordpress 会把 https 协议的域名也当作 http 处理。这会导致一些图片无法加载。

此种情况下,我们还要分辨是使用了 http 还是 https 协议。

识别协议可以使用 php 函数$_SERVER['HTTPS']

php 复制代码
$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';

用这个方法分辨后再去 define url 似乎也可以,可是我的情况更恼人一些,由于我是用 frp 工具内网穿透了服务,我的本地 wordpress 服务是没配置 https 访问的,但是我的内网穿透服务器配置了 https 访问。这导致虽然用户是通过https://domain.com访问的博客,但是本地的 wordpress 感受不到,它仍然认为是通过http://domain.com访问的。这是因为协议头是逐跳标头,只能逐级传递不能跳传,所以 https 的信息传到内网穿透服务器就不再向下传了。
公网服务器domain.com 内网服务器 https http nginx wordpress 用户

这种情况下,$_SERVER['HTTPS']是无法分辨的。所以只能另辟蹊径,用访问字头是数字还是非数字来判断是通过 ip 还是域名访问的,如果是 ip 访问,那就加上 http ;如果是域名那就加上 https。

php 复制代码
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还有一个地方需要修改,添加下面的语句。

php 复制代码
$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

这样就可以 https 登录后台了。

总结

两个问题如果是分别出现,那么分别处理就好,但是我的情况是既要 https 登陆后台,也要保留内网 ip 操作的能力。所以不能武断把两段代码一起插进去,而要结合一起,ip 访问时,不开启 https 登录;域名访问是开启 https 登录。

php 复制代码
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']);
相关推荐
2501_915921431 小时前
iOS应用耗电测试:使用Energy Log、Keymob和Instruments进行性能监控与能源消耗分析
android·ios·小程序·https·uni-app·iphone·webview
盛世宏博智慧档案2 小时前
算力机房多协议融合:Modbus TCP 温湿度变送器与 SNMP 设备混合组网方案
网络·网络协议·tcp/ip·传感器·温湿度
严谨的麻辣烫3 小时前
静态代理 IP 的出口一致性如何验证?Python 请求检测与异常排查
开发语言·python·http·网络安全
川石课堂软件测试4 小时前
涨薪技术|0到1学会性能测试第9课-HTTP响应统计
数据库·功能测试·网络协议·http·kubernetes·单元测试·测试用例
可信时间戳5 小时前
原创作品怎么申请版权?草稿、定稿、已发布、已授权,四个阶段四个做法
网络协议·http·https
话梅姐姐呀5 小时前
TCP/IP 架构各层的协议概述
人工智能·物联网·网络协议·tcp/ip·iot
余槐i5 小时前
加了Cookie yt-dlp仍报HTTP 403:3个容易漏的请求头差异
python·http·ffmpeg·开发工具·yt-dlp
husterlichf6 小时前
网关、掩码、子网、vlan、交换机
网络·网络协议
酒神dnspup7 小时前
HTTP Keep-Alive 与连接池实战:TIME_WAIT、端口耗尽和复用率怎么排查
http·keep-alive·tcp·连接池
斌糖雪梨9 小时前
registerListeners(); 方法详解
网络·网络协议·rpc