X-Forwarded-Proto and Flask



我有与本SO问答中描述的问题完全相同的问题。这个问题的答案很好,但我不理解根本问题。在负载平衡器处终止SSL并在负载平衡器和web/app服务器之间使用HTTP是非常常见的。堆栈中的哪一部分不尊重X-Forwarded-Proto?是werkzeug吗?瓶子uwsgi?

在我的情况下,我使用的是AWS ELB(设置X-Forwarded-Proto)=>Nginx(沿X-Forwarded-Proto转发到uwsgi)。但在python应用程序中,我必须像上面提到的问题中所描述的那样,对Flask Request进行子类化。

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

您缺少ProxyFix()中间件组件。请参阅"烧瓶代理设置"文档。

没有必要对任何东西进行子类化;只需将此中间件组件添加到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_proto=1)

如果你安装了Flask,你也安装了Werkzeug,但一定要将版本固定为>0.15以获得ProxyFix的更新版本(Flask 1.1.0及更新版本已经使用该版本)。

此组件从X-Forwarded-Proto标头设置WSGI方案。请阅读我在上面为您链接的Flask文档,关于信任标头和根据您的具体情况定制中间件。上面,我已经将其配置为只查看X-Forwarded-Proto,但该组件也可以处理其他X-Forwarded-*配置。

默认情况是信任一个级别的X-Forwarded-For,如果要禁用此功能,请将x_for=0添加到关键字参数中。

还要注意的是,ProxyFix中间件的功能在Werkzeug 0.15中得到了相当大的扩展;除了X-Forwarded-Proto-For-Host,还参考了X-Forwarded-Port-Prefix报头,所有报头都支持多个值。

最新更新