这是我的缩写 nginx vhost conf:
upstream gunicorn {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
listen 443 ssl;
server_name domain.com ~^.+\.domain\.com$;
location / {
try_files $uri @proxy;
}
location @proxy {
proxy_pass_header Server;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 120;
proxy_pass http://gunicorn;
}
}
Run Code Online (Sandbox Code Playgroud)
同一台服务器需要同时提供 HTTP 和 HTTPS 服务,但是,当上游发出重定向(例如,在处理表单之后)时,所有 HTTPS 请求都将重定向到 HTTP。我发现唯一可以解决此问题的方法是更改proxy_redirect为以下内容:
proxy_redirect http:// https://;
Run Code Online (Sandbox Code Playgroud)
这对于来自 HTTPS 的请求非常有效,但如果通过 HTTP 发出重定向,它也会将其重定向到 HTTPS,这是一个问题。
无奈之下,我尝试了:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
Run Code Online (Sandbox Code Playgroud)
但是 nginx 抱怨proxy_redirect这里不允许这样做。
我能想到的唯一其他选择是分别定义两个服务器并proxy_redirect仅在 SSL 上设置,但是我会复制其余的 conf(server为了简单起见,我省略了指令中的很多内容)。我知道我也可以使用include指令来排除冗余,但我真的只想保留一个没有任何依赖关系的 conf 文件。
那么,首先,我是否遗漏了可以完全解决问题的东西?或者,第二,如果没有,有没有其他方法(除了包括外部文件)来提取冗余配置信息,以便我可以分离出服务器配置的 HTTP 和 HTTPS 版本?
Chr*_*att 30
好吧,我得到了一些灵感并尝试了:
proxy_redirect http:// $scheme://;
Run Code Online (Sandbox Code Playgroud)
这似乎可以解决问题。不过,这对我来说仍然很棘手,所以我仍然欢迎任何关于我可能做错的事情的指导,或者为了达到相同的结果而采取的不那么黑客的方法。
另一种解决方案是向上游指示请求是 HTTP 还是 HTTPS,并让它发出相应的重定向。在 nginx 配置中添加它会为上游设置一个头来检查。
proxy_set_header X-Scheme $scheme;
Run Code Online (Sandbox Code Playgroud)