我有与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
标头,所有标头都支持多个值。