WordPress Docker 通过 NGINX SSL 反向代理无法按预期工作

WordPress Docker over NGINX SSL reverse proxy doesn't work as expected

当我使用 NGINX 为 WordPress Docker 容器创建反向代理时,WordPress 将 WordPress Address (URL)Site Address (URL) 指定为 https://hiddenurl.com:443。所以我所有的链接都包含端口 443,如果我删除这个端口,由于无限重定向循环,该网站将无法再访问。

我已在 wp-config.php 中输入应该通过 $_SERVER['HTTPS'] = 'on'; 激活 SSL。

NGINX 配置:

    location ~ /(?<wppath>.*) {
        rewrite ^/(.*) / break;
        client_max_body_size 100M;
        proxy_pass http://127.0.0.1:7676/$wppath$is_args$args;
        proxy_http_version 1.1;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-forwarded protocol https;
        proxy_set_header upgrade $http_upgrade;
        proxy_set_header Connection "upgrade
    }

这会导致域 hiddenurl.com 正常工作,但 hiddenurl.com/about 会重定向到 127.0.0.1/about

重定向似乎来自 WordPress:

我通过将其用作 nginx 配置解决了这个问题:

    location / {
        proxy_pass         http://127.0.0.1:7676;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
        proxy_set_header   X-Forwarded-Proto https;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;

      }

并将其附加到 wp-config.php

的顶部
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
    $_SERVER['HTTPS'] = '1';

if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}

我也有一个 WordPress 301 重定向循环,使用 WordPress 容器在 nginx 反向代理后面的端口 80 上服务,配置如下:

server {
    # SSL configuration
    #
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name   _______.com.au   www._______.com.au;
    proxy_redirect off;
    
    location / {                      
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://192.168.0.0:6080/;
            
    }


    ssl_certificate /etc/letsencrypt/live/_______.com.au/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/_______.com.au/privkey.pem; # managed by Certbot

}

server {
    if ($host = www._______.com.au) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = _______.com.au) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;

    server_name   _______.com.au   www._______.com.au;
    return 301 https://_______.com.au$request_uri;
}

我的 wp_config.php 使用的是官方 WordPress Docker 容器生成的默认配置。 canonical.php函数出现问题是因为nginx配置中的这一行:

proxy_set_header Host $host:$server_port;

当 url 传递到 canonical.php 函数时,设置了 301 重定向循环,因为 https://______.com.au:443https://______.com.au 不同。删除 $server_port 解决了我的问题:

proxy_set_header Host $host;

我希望我耗时的调查可以节省一些时间!