X-Forward-Proto和Flask

发布于 2021-01-29 18:58:41

我在本SO问答中也描述了同样的问题。该问题的答案是一个不错的解决方法,但我不理解基本问题。在负载平衡器处终止SSL并在负载平衡器与Web/应用服务器之间使用HTTP十分常见。哪一部分堆栈不遵守X-Forwarded-Proto?是werkzeug吗?烧瓶?uwsgi?

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

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

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您缺少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头部也咨询过,所有接头支持多个值。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看