X-Forwarded-Proto 和 Flask
Posted
技术标签:
【中文标题】X-Forwarded-Proto 和 Flask【英文标题】:X-Forwarded-Proto and 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 进行子类化。
既然这是这么常见的部署场景,看来应该有更好的解决方案了。我错过了什么?
【问题讨论】:
【参考方案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)”没有为我工作。以上是关于X-Forwarded-Proto 和 Flask的主要内容,如果未能解决你的问题,请参考以下文章
X-Forwarded-Proto 为 http 时取消设置 HTTPS 环境变量
.htaccess 中的 apache HTTP:X-Forwarded-Proto 导致开发环境中的重定向循环
Google Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头
什么是X-Forwarded-Proto HTTP标头的完整规范?