Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 如何使用nginx通过proxy_pass使用$scheme正确重定向请求?_Docker_Nginx_Reverse Proxy - Fatal编程技术网

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

Docker 如何使用nginx通过proxy_pass使用$scheme正确重定向请求?,docker,nginx,reverse-proxy,Docker,Nginx,Reverse Proxy,我已经设置了两个nginx实例,如下所示: nginx (https) → docker:[nginx (http) → uwsgi] 面向前端的nginx进程公开了https服务,该服务通过proxy\u pass将所有请求传递给docker nginx进程。它还将所有请求重定向到http→ https 问题在于docker nginx进程在其默认服务器实例的位置块中有以下行: server { ... location = / { return 301 $s

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

nginx (https) → docker:[nginx (http) → uwsgi]
面向前端的nginx进程公开了
https
服务,该服务通过
proxy\u pass
将所有请求传递给docker nginx进程。它还将所有请求重定向到
http
→ <代码>https

问题在于docker nginx进程在其默认服务器实例的位置块中有以下行:

server {
    ...
    location = / {
        return 301 $scheme://$http_host${request_uri}login/;
    }
}
server {
  absolute_redirect off;
  ...
目的是重定向/到登录页面。除了重定向总是指向
http://...
url。例如,请求
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-Proto
X-Scheme
proxy\u redirect
,即:


我发现的一个技巧是,您可以禁用绝对重定向(例如,而不是重定向到http://localhost/your_url_with_trailing_slash_now 它将重定向到/your\u url\u,后面带有“\u斜杠”\u now)

将以下内容添加到服务器块内的任意点(执行301重定向的nginx实例,在您的示例中为nginx docker实例):


更多信息可以在这里找到:

我发现的一个技巧是,您可以禁用绝对重定向(例如,而不是重定向到http://localhost/your_url_with_trailing_slash_now 它将重定向到/your\u url\u,后面带有“\u斜杠”\u now)

将以下内容添加到服务器块内的任意点(执行301重定向的nginx实例,在您的示例中为nginx docker实例):

更多信息可在此处找到: