我在这个问题和答案中描述了完全相同的问题。 这个问题的答案是一个很好的工作,但我不明白的根本问题。 在负载平衡器上终止SSL并在负载平衡器和Web /应用程序服务器之间使用HTTP是非常普遍的。 什么堆栈不尊重X-Forwarded-Proto? 这是否是werkzeug? 烧瓶? uwsgi?
在我的情况下,我正在使用AWS ELB(它设置X-Forwarded-Proto)=> Nginx(沿着X-Forwarded-Proto转发到uwsgi)。 但是在python应用程序中,我必须按照上面引用的问题中的描述子类Flask Request。
由于这是一个常见的部署scheme,似乎应该有一个更好的解决scheme。 我错过了什么?
您缺少ProxyFix()
中间件组件 。 请参阅Flask 代理设置文档 。
没有必要子类化任何东西; 只需将这个中间件组件添加到您的WSGI堆栈:
from werkzeug.contrib.fixers import ProxyFix from flask import Flask app = Flask(__name__) app.wsgi_app = ProxyFix(app.wsgi_app)
如果你安装了Flask,那么你也有Werkzeug。
该组件从X-Forwarded-Proto标头设置WSGI方案 。 请阅读我上面链接到的关于信任标头的Flask文档,以及如何根据您的具体情况定制中间件。