本文最后更新于 2025-04-02,文章内容可能已经过时。

v2-1cb6088481b525a3fcbe9230991fa5ba_1440w.png

一、问题描述

假设WordPress以http方式监听服务器上的8080端口,Nginx监听443端口,WordPress网站要求以 https://域名 的形式访问。

Nginx 配置里直接 proxy会遇到两个问题:

  1. WordPress 网站的 css、js、图片等资源无法加载,浏览器控制台报“mixed content”的错误。这是因为网站以https形式访问,而 WordPress 页面的资源是 http 形式,因此浏览器拒绝加载;

  2. 登录 WordPress 管理后台,出现循环重定向,导致登录页和管理后台都无法打开。

经过分析,问题出现的原因分别为:

  1. WordPress 不知道网站通过 https 访问,因此页面中输出的链接是 http 形式;

  2. WordPress 获取到的信息是端口为 8080,而站点设置的端口是 443,因此循环重定向。

二、环境描述

WordPress 网站所在内网地址:http://192.168.50.130:8080
Nginx Proxy Manager 代理地址:https://blog.fxpblogs.win

三、解决方法

1、NPM 代理设置中添加高级设置(Advanced):

location / {
    proxy_pass http://192.168.50.130:8080;
    proxy_set_header Host $host:$server_port;# 客户端IP
    proxy_set_header X-Real-IP $remote_addr; # 反向代理域名
    proxy_set_header X-Forwarded-Host $host:$server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
    client_max_body_size 0;
    proxy_redirect off;
}

2、修改 WordPress 的 Docker Compose 目录下的 wp-config.php,在 require_once ABSPATH . 'wp-settings.php';语句前添加(通常在最后面):

// 根据$_SERVER['HTTP_X_FORWARDED_PROTO']判断反向代理过来的是否为https请求
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';    // 表示当前访问为https
}

// 判断是否访问请求经过代理
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];    // 如果经过代理,需要修改主机地址
}

// 访问后台强制使用https
define('FORCE_SSL_ADMIN', true);
define('CONCATENATE_SCRIPTS', false );

3、进入 WordPress 控制台,设置 WordPress 地址(URL)和站点地址(URL)为 NPM 代理地址,即 https://blog.fxpblogs.win

4、重启 WordPress 容器

参考文章: