本文最后更新于58 天前,其中的信息可能已经过时,如有错误请发送邮件到17671220626@139.com
前言
在搭建个人博客(HomeLab)的过程中,我们经常使用 NPM (Nginx Proxy Manager) 作为网关,通过 frp 内网穿透到家中的服务器。但在配置 SSL 证书后,访问 WordPress 后台常常会遇到“该网页无法正常运作,重定向次数过多”的报错。本文将深入剖析其背后的协议冲突原因,并给出终极解决方案。
一、 故障现象与环境
- 网络架构:用户 (HTTPS) -> NPM (SSL 卸载) -> frp (HTTP 隧道) -> WordPress (Docker/内网机器)。
- 报错信息:浏览器提示
ERR_TOO_MANY_REDIRECTS。 - 诡异表现:主页访问正常,但登录
/wp-admin后台时陷入死循环;内网直接通过 IP 访问却完全正常。
二、 核心原因分析:协议“认知不对等”
这是典型的 SSL 卸载(SSL Termination) 导致的后遗症。
- 外部请求是
HTTPS,但 NPM 在转发给内网时将其转成了HTTP。 - WordPress 视角:它收到了一个
HTTP请求。处于安全考虑,WordPress 默认配置会强制后台使用加密连接,于是它发出指令:“请重定向到HTTPS版本的地址”。 - 死循环:浏览器收到重定向再次请求
HTTPS-> NPM 再次转成http传给后端 -> WordPress 发现还是HTTP,再次要求重定向。
三、 终极解决方案
要打破这个死循环,我们需要在 Nginx 端传信号,并在 WordPress 端接信号。
1. Nginx Proxy Manager 端配置

在 NPM 的 Advanced 配置中,我们需要注入关键的 Header 指令,告诉后端“外网其实是 HTTPS”。
完整 Advanced 配置:
Nginx
# 1. 基础转发设置:确保 Host 域名正确传递
proxy_set_header Host $host;
# 2. 传递真实 IP:让 WordPress 评论区显示正确的访客 IP 而不是 frp 的 IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 3. 协议透传:告诉后端原始请求是 HTTPS
proxy_set_header X-Forwarded-Proto $scheme;
# 4. 端口透传:告知标准的 HTTPS 端口
proxy_set_header X-Forwarded-Port 443;
# 5. 修复重定向中的 Host 丢失问题
proxy_redirect off;
2. WordPress 端配置(关键补丁)
仅仅在 Nginx 设置是不够的,WordPress 默认不读取 X-Forwarded-Proto。我们需要修改根目录下的 wp-config.php,在 /* That's all, stop editing! */ 之前添加以下强制识别逻辑:
/** 解决 Nginx 反向代理导致的 HTTPS 识别问题 */
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
/** 强制定义站点 URL,防止协议降级 */
define('WP_HOME', 'https://你的域名');
define('WP_SITEURL', 'https://你的域名');
/** 强制后台管理界面使用 SSL */
define('FORCE_SSL_ADMIN', true);
3. frp客户端配置
[[proxies]]
name = “name”
type = “http”
localPort = 8080
customDomains = [“example.com”]
四、 总结
解决该问题的核心在于 $_SERVER['HTTPS'] = 'on';。通过在配置文件中手动强制开启这个变量,我们相当于给了 WordPress 一颗“定心丸”,让它意识到自己正处于安全的转发链条中,从而停止无意义的重定向跳转。