Nginx,gunicorn,python-flask应用程序。 Https在重定向时丢失

时间:2016-02-02 06:05:40

标签: redirect nginx https flask gunicorn

我的申请遇到了一些麻烦。在重定向期间,我的烧瓶应用程序会丢失https并重定向到http。

我一直试图找到解决方案,但没有任何作用。

我的应用程序(位置/)的nginx配置如下:

proxy_pass http://localhost:5400;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-port 443;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

(互联网上的一些例子说使用" X-Forwarded-Proto"。我已经尝试过但没有成功。还要使用" ssl"或&# 34; https"作为该参数的值。

在flask应用程序(before_request :)中的简单打印显示它仍然是http请求发生的事件,虽然我在客户端和nginx之间使用https。

print(request.environ["wsgi.url_scheme"])

我做错了什么?

2 个答案:

答案 0 :(得分:2)

如果您的应用程序忽略了用于在http 3xx响应中设置方案的X-Forwarded标头,您可以尝试设置一个或多个proxy_redirect规则:

proxy_redirect http:// $scheme://;

有关详细信息,请参阅this document

答案 1 :(得分:0)

警告即可。进行不必要的HTTP重定向是一个安全漏洞,因为在那些请求中连接没有加密!!

这里唯一的解决方案是正确配置NGINX和GUNICORN以允许Flask使用正确的标题。

NGINX配置应至少包含以下指令:

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-Proto $scheme;
proxy_set_header        X-Forwarded-Host $http_host;
proxy_pass              http://appserver:5000;

而且,这是真正的解决方案,GUnicorn 必须以 --forwarded-allow-ips参数启动。

以下是我如何在生产中启动它,同时修复日志中的真实IP地址(谨防投诉GDPR:P):

PYTHONUNBUFFERED=FALSE gunicorn              \
                        --access-logfile '-' \
                        --access-logformat '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" "%({X-Real-IP}i)s"' \
                        -b :5000             \
                        --forwarded-allow-ips="*" \
                        app:app

你应该从不在HTTP中发送请求。第一个也是唯一的重定向应该是/