【问题标题】:X-Forwarded-Proto and FlaskX-Forwarded-Proto 和 Flask
【发布时间】:2014-06-14 08:54:42
【问题描述】:

我遇到了与this SO question and answer 中描述的完全相同的问题。这个问题的答案是一个很好的解决方法,但我不明白根本问题。在负载均衡器处终止 SSL 并在负载均衡器和 Web/应用程序服务器之间使用 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】:

    您缺少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_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-* 配置。

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

    还请注意,ProxyFix 中间件的功能在 Werkzeug 0.15 中得到了显着扩展;除了X-Forwarded-Proto-For-Host之外,还参考了X-Forwarded-Port-Prefix的头部,所有头部都支持多个值。

    【讨论】:

    • 遇到了这个问题,在我使用 Apache 作为反向代理的开发环境中,X-Forwarded-Proto 被正确地传递和尊重……在产品中,ELB 正确地传递了标头,但出于某种原因它不起作用(仍然不确定为什么),但 ProxyFix 解决了这个问题。
    • 这是很棒的信息!但是我仍然很好奇“堆栈的哪一部分不尊重 X-Forwarded-Proto?是 werkzeug?Flask?uwsgi?”或者,除非我们指定有一个可信代理正在编写这些标头,否则不应“尊重” X​​-Forwarded-Proto 标头?
    • @NealGokli:后者。互联网上的任何人都可以设置该标题..
    • @MartijnPieters:有道理!您可能想在linked question 中添加答案!我正要在这里链接到你的答案,但我应该让你这样做,因为你在“周围”!
    • 对于其他任何人 - 这对我在 Google App Engine Flex 环境上运行的烧瓶舞应用程序有效,而通常引用的“app.wsgi_app = ProxyFix(app.wsgi_app)”没有为我工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2021-12-06
    • 2014-01-11
    • 2019-07-19
    • 2019-01-26
    相关资源
    最近更新 更多