X-Forward-Proto和Flask
我在本SO问答中也描述了同样的问题。该问题的答案是一个不错的解决方法,但我不理解基本问题。在负载平衡器处终止SSL并在负载平衡器与Web/应用服务器之间使用HTTP十分常见。哪一部分堆栈不遵守X-Forwarded-Proto?是werkzeug吗?烧瓶?uwsgi?
就我而言,我使用的是AWS ELB(设置了X-Forwarded-Proto)=> Nginx(它沿着X-Forwarded-
Proto转发到uwsgi)。但是在python应用程序中,我必须按照上面提到的问题中的描述将Flask Request子类化。
由于这是一种常见的部署方案,因此似乎应该有一个更好的解决方案。我想念什么?
-
您缺少
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)
如果您安装了Flask,也有Werkzeug,但请将版本固定为> = 0.15,以获取更新的版本
ProxyFix
(Flask
1.1.0及更高版本已使用该版本)。该组件从X-Forwarded-
Proto标头设置WSGI方案。请阅读我上面链接到的Flask文档,其中包括有关信任标头和根据特定情况自定义中间件的信息。上面,我将其配置为仅查看X-Forwarded- Proto
,但该组件也可以处理其他X-Forwarded-*
配置。还要注意,
ProxyFix
中间件的功能在Werkzeug 0.15中已经得到了很大的扩展。此外X-Forwarded- Proto
,-For
和-Host
中,X-Forwarded-Port
和-Prefix
头部也咨询过,所有接头支持多个值。