我已经设置了两个nginx实例,如下所示:
nginx (https) → docker:[nginx (http) → uwsgi]
面向前的nginx进程公开了https
服务,该服务通过proxy_pass
将所有请求传递给 docker nginx进程。它还会将所有请求重定向到http
→https
。
问题是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-Proto
,X-Scheme
和proxy_redirect
的所有可能组合,如其他答案所示:
Nginx does redirect, not proxy
how to handle nginx reverse proxy https to http scheme redirect
答案 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