Python X-Proto和烧瓶

Python X-Proto和烧瓶,python,nginx,flask,uwsgi,werkzeug,Python,Nginx,Flask,Uwsgi,Werkzeug,我遇到了与中描述的完全相同的问题。这个问题的答案是一个很好的解决办法,但我不理解根本问题。在负载平衡器处终止SSL并在负载平衡器和web/app服务器之间使用HTTP是非常常见的。堆栈的哪一部分不尊重X-Proto?是werkzeug吗?瓶子uwsgi 在我的例子中,我使用的是AWS ELB(它设置了X-Forwarded-Proto)=>Nginx(它沿着X-Forwarded-Proto转发到uwsgi)。但是在python应用程序中,我必须按照我上面提到的问题中所述对Flask请求进行子类

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

在我的例子中,我使用的是AWS ELB(它设置了X-Forwarded-Proto)=>Nginx(它沿着X-Forwarded-Proto转发到uwsgi)。但是在python应用程序中,我必须按照我上面提到的问题中所述对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_proto=1)
如果您安装了Flask,您也安装了Werkzeug,但请将版本锁定为>=0.15,以获得更新版本的
ProxyFix
(Flask 1.1.0及更新版本已使用该版本)

这个组件。请阅读我在上面链接到的有关信任头和根据您的具体情况定制中间件的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
头文件,所有头文件都支持多个值。

在使用Apache作为反向代理的我的开发环境中遇到了这个问题,X-Forwarded-Proto被正确地传递和尊重…在prod中,ELB正确地传递了标头,但由于某些原因它无法工作(仍然不确定为什么),但ProxyFix解决了这个问题。这是一个很好的信息!但我仍然很好奇“堆栈中的哪一部分不尊重X-Forwarded-Proto?是werkzeug?Flask?uwsgi?”还是X-Forwarded-Proto头不应该被“尊重”,除非我们指定有一个可信的代理在写这些头?@NealGokli:后者。互联网上的任何人都可以设置该标题。@MartijnPieters:有道理!您可能需要为该问题添加答案!我正要在这里链接到你的答案,但我应该让你这么做,因为你“在附近”!对于其他人来说——这对我在Google App Engine Flex环境下运行的flask dance应用程序来说是有效的,而通常引用的“App.wsgi_App=ProxyFix(App.wsgi_App)”对我来说并不有效。