这是我的缩写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;
}
}
同一台服务器需要同时服务HTTP和HTTPS,但是,当上游发出重定向(例如,在处理表单之后)时,所有HTTPS请求都将重定向到HTTP。我发现可以解决此问题的唯一方法是更改proxy_redirect
为以下内容:
proxy_redirect http:// https://;
这对于来自HTTPS的请求非常有用,但是如果通过HTTP发出重定向,它也会将其重定向到HTTPS,这是一个问题。
出于绝望,我尝试了:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
但是nginx抱怨proxy_redirect
这里不允许这样做。
我唯一想到的另一种选择是分别定义两个服务器,并proxy_redirect
仅在SSL上设置,但随后我将复制其余的conf(server
为简化起见,我省略了很多指令)。我知道我也可以使用一条include
指令来排除冗余,但是我真的想只保留一个conf文件而没有任何依赖关系。
所以,首先,我缺少什么可以完全消除问题的东西吗?或者,第二,如果不是,是否还有其他方法(包括外部文件)来排除冗余配置信息,以便我可以区分出服务器配置的HTTP和HTTPS版本?