X-Forwarded-Proto和Flask

Ben*_*ley 18 python nginx werkzeug flask uwsgi

我有这个问题和答案中描述的完全相同的问题.这个问题的答案是一个很好的解决方法,但我不明白根本问题.在负载均衡器处终止SSL并在负载均衡器和Web/app服务器之间使用HTTP非常常见.什么片段不尊重X-Forwarded-Proto?是werkzeug吗?烧瓶?uwsgi?

在我的情况下,我正在使用AWS ELB(设置X-Forwarded-Proto)=> Nginx(它沿着X-Forwarded-Proto转发到uwsgi).但是在python应用程序中,我必须按照上面引用的问题中描述的Flask Request子类.

由于这是一种常见的部署方案,似乎应该有更好的解决方案.我错过了什么?

Mar*_*ers 34

您缺少ProxyFix()中间件组件.请参阅Flask 代理设置文档.

没有必要继承任何东西; 只需将此中间件组件添加到WSGI堆栈:

# Werkzeug 0.15 and newer
from werkzeug.middleware.proxy_fix import ProxyFix
from flask import Flask


app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app, x_num=0, x_proto=1)
Run Code Online (Sandbox Code Playgroud)

如果您安装了Flask,那么您也有Werkzeug.

此组件从X-Forwarded-Proto标头设置WSGI方案.请阅读我上面链接到的关于信任标题的Flask文档以及根据您的具体情况自定义中间件.

  • 遇到这个问题,在我使用 Apache 作为反向代理的开发环境中,X-Forwarded-Proto 被正确传递和尊重……在生产中,ELB 正确传递标头但由于某种原因它没有工作(仍然没有确定原因)但 ProxyFix 解决了这个问题。 (2认同)