X-Forwarded-Proto和Flask

时间:2014-04-28 17:23:33

标签: python nginx flask uwsgi werkzeug

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

就我而言,我使用AWS ELB(设置X-Forwarded-Proto)=> Nginx(沿着X-Forwarded-Proto转发给uwsgi)。但是在python应用程序中,我必须按照上面引用的问题中描述的Flask Request子类。

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

1 个答案:

答案 0 :(得分:31)

您错过了ProxyFix() middleware component。请参阅Flask Proxy Setups documentation

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

try:
    # Werkzeug 0.15 and newer
    from werkzeug.middleware.proxy_fix import ProxyFix
except ImportError:
    # older releases
    from werkzeug.contrib.fixers import ProxyFix
from flask import Flask


app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)

如果你安装了Flask,你也有Werkzeug。

此组件sets the WSGI scheme from the X-Forwarded-Proto header。请阅读我上面链接到的关于信任标题的Flask文档以及根据您的具体情况自定义中间件。

另请注意,在Werkzeug 0.15中,ProxyFix中间件的功能已经大大扩展;除了X-Forwarded-Proto-For-Host之外,还会查询X-Forwarded-Port-Prefix标头,所有标头都支持多个值。