Nginx 返回 GET 本地 IP 而不是域名

Nginx 返回 GET 本地 IP 而不是域名

我在单独的 LXC 容器中使用 Nginx 作为我所有虚拟机和 LXC 容器的反向代理。当我尝试向我的网站(例如 phpmyadmin 或 Yunohost,它们位于单独的虚拟机中)验证自己的身份时,如果 POST 来自域,Nginx 会返回来自本地 IP 的响应!

Nginx 返回本地IP而不是域名 Nginx 返回本地IP而不是域名

这里我尝试对 phpmyadmin 进行身份验证。验证通过后,我必须刷新页面才能成功连接。

这是我的 nginx 配置:

server {
    listen 80;
    server_name     mysql.mydomain.com;
    location / {
            proxy_pass      http://10.0.2.103;
    }
}

我的默认文件是:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        location / {
                try_files $uri $uri/ =404;
                proxy_set_header    Host                $http_host;
                proxy_set_header    X-Real-IP           $remote_addr;
#               proxy_set_header    X-Forwarded-Ssl     on;
                proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
                fastcgi_param REMOTE_ADDR $http_x_real_ip;

                proxy_set_header    X-Forwarded-Proto   $scheme;
                proxy_set_header    X-Frame-Options     SAMEORIGIN;
        }

        # Pour let's encrypt
        location '/.well-known/acme-challenge' {
                default_type "text/plain";
                root         /root/certbot-auto/;
        }

        # On interdit tout autre appel
        location ~ /\. {
                deny all; access_log off; log_not_found off;
        }
}

每个 VM 上的每项服务都使用 Apache。

编辑:我之前使用 CloudFlare 进行 SSL 认证。现在我将 Let's Encrypt 与 Nginx 结合使用,但仍然遇到同样的问题。

EDIT2:我通过在 phpmyadmin 的配置文件中强制其使用绝对 URL 解决了 phpmyadmin 的问题:

$cfg['PmaAbsoluteUri'] = 'https://mysql.example.com/';

但在我的其他 LXC 容器和虚拟机中,其他服务也存在同样的问题。

当我第一次尝试在 QEMU 中连接到指向 Yunohost 的 URL agora.mydomain.com 时,发生了以下情况:

请求 agora.mydomain.com 成为本地 IP 请求 agora.mydomain.com 成为本地 IP

我的 nginx VirtualHost 非常简单:

server {
    listen 80;
    server_name     agora.mydomain.com;

    location / {
        proxy_pass      http://10.0.2.106;
#       return 301      https://agora.mydomain.com$request_uri;
    }
}

在 Yunohost VM 本地使用时lynx localhost,它可以工作,所以我认为这是一个 Nginx 问题。

我的网站论坛也出现了同样的问题,在另一台 VM 上再次使用 screambox,但只有当我尝试在登录页面进行身份验证时才会出现这种情况。

答案1

我认为问题出在 proxy_pass 指令中的地址上。使用正确的主机名而不是 IP 地址或添加主机标头

具有定义的上游

upstream agora.mydomain.com {
    server 10.0.2.106;
}

server {
    listen 80;
    server_name     agora.mydomain.com;

    location / {
        proxy_pass      http://agora.mydomain.com;
    }
}

或者仅使用主机头

server {
    listen 80;
    server_name     agora.mydomain.com;

    location / {
        proxy_set_header Host $host;
        proxy_pass      http://10.0.2.106;
    }
}

相关内容