X-Forwarded-Proto和Flask

问题描述 投票:17回答:1

我在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子类。

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

python nginx flask uwsgi werkzeug
1个回答
32
投票

你错过了ProxyFix() middleware component。参见Flask Proxy Setups documentation

没有必要继承任何东西;只需将此中间件组件添加到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)

如果你安装了Flask,你也有Werkzeug,但确实将版本固定到> = 0.15以获得更新版本的ProxyFix(Flask 1.1.0和更新版本已经使用该版本)。

这个组件sets the WSGI scheme from the X-Forwarded-Proto header。请阅读我上面链接到的关于信任标题的Flask文档以及根据您的具体情况自定义中间件。上面,我已将其配置为仅查看X-Forwarded-Proto,但该组件也可以处理其他X-Forwarded-*配置。

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

© www.soinside.com 2019 - 2024. All rights reserved.