这里是我简写的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,但是,当上游发出redirect(例如,处理表单后)时,所有HTTPS请求都会redirect到HTTP。 我唯一能find的解决方法就是将proxy_redirect更改为以下内容:
proxy_redirect http:// https://;
这对于来自HTTPS的请求来说非常有效,但是如果通过HTTP发送redirect,它也会将其redirect到HTTPS,这是一个问题。
出于绝望,我尝试了:
if ($scheme = 'https') { proxy_redirect http:// https://; }
但nginx抱怨proxy_redirect不允许在这里。
我能想到的唯一的另一个select是分别定义两个服务器,并只在SSL上设置proxy_redirect ,但是我会重复其余的conf( server指令中有很多,为简单起见我省略了) 。 我知道我也可以使用include指令来分解冗余,但我真的只想保留一个没有任何依赖关系的conf文件。
那么,首先,有什么我错过了会完全否定这个问题? 或者,其次,如果没有,除了包含外部文件之外,还有其他的方法来分解冗余的configuration信息,以便我可以分离服务器configuration的HTTP和HTTPS版本吗?
那么,我有一些启发和尝试:
proxy_redirect http:// $scheme://;
这似乎是伎俩。 尽pipe如此,对我来说,这仍然看起来很棘手,所以我仍然欢迎任何可能做出错误或不太可靠的方法来达到相同结果的任何指导。
另一个解决scheme是向上游指示请求是HTTP还是HTTPS,并发出相应的redirect。 在nginxconfiguration中添加这个会为上游设置一个标题来检查。
proxy_set_header X-Scheme $scheme;