我的申请遇到了一些麻烦。在重定向期间,我的烧瓶应用程序会丢失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"])
我做错了什么?
答案 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中发送请求。第一个也是唯一的重定向应该是/
。