如何使用Nginx通过proxy_pass通过$ scheme正确重定向请求?

时间:2020-01-01 02:06:00

标签: docker nginx reverse-proxy

我已经设置了两个nginx实例,如下所示:

nginx (https) → docker:[nginx (http) → uwsgi]

面向前的nginx进程公开了https服务,该服务通过proxy_pass将所有请求传递给 docker nginx进程。它还会将所有请求重定向到httphttps

问题是docker nginx进程在其默认服务器实例的location块中包含以下行:

server {
    ...
    location = / {
        return 301 $scheme://$http_host${request_uri}login/;
    }
}

旨在将/重定向到登录页面。除重定向始终始终指向http://...网址外,此方法工作正常。例如。对http://myserver.com/的请求将被重定向到https://myserver.com/,然后被传递给docker nginx,后者返回带有以下URL的301:http://myserver.com/login/。我希望它是https://myserver.com/login/或前端服务器可能提供的任何架构。

这是我设置前端nginx进程的方式:

server {
    listen       443 ssl http2 default_server;
    ...

    location / {
        proxy_pass http://localhost:81;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_cache_bypass    $http_upgrade;

        proxy_redirect     https:// http://;
        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 $scheme;
        proxy_set_header   X-Scheme $scheme;
    }
}

server {
    listen       80 default_server;
    ...

    location = / {
        return 301 https://$http_host${request_uri};
    }

}

这种重定向是否可能?

另外,如果您想知道,我还尝试了X-Forwarded-ProtoX-Schemeproxy_redirect的所有可能组合,如其他答案所示:

Nginx does redirect, not proxy

how to handle nginx reverse proxy https to http scheme redirect

1 个答案:

答案 0 :(得分:0)

我发现的一个技巧是您可以禁用绝对重定向(例如,而不是重定向到http:// localhost / your_url_with_trailing_slash_now,它将重定向到/ your_url_with_trailing_slash_now)。

将以下内容添加到服务器块内(执行此301重定向的nginx实例的nginx-docker实例)的任何位置:

server {
  absolute_redirect off;
  ...

更多信息可以在这里找到:https://serverfault.com/questions/227742/prevent-port-change-on-redirect-in-nginx