我有与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进行子类化。

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

最佳答案

您缺少ProxyFix() middleware component。参见烧瓶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_num=0, 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-*配置。

还要注意,ProxyFix中间件的功能在Werkzeug 0.15中已得到相当大的扩展。除了X-Forwarded-Proto-For-Host外,还请参考X-Forwarded-Port-Prefix标头,所有标头都支持多个值。

09-20 22:38