Docker 如何使用nginx通过proxy_pass使用$scheme正确重定向请求?
我已经设置了两个nginx实例,如下所示: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 (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实例): 更多信息可在此处找到: