我在this SO question and answer中描述了完全相同的问题。这个问题的答案是一个很好的解决方法,但我不明白根本问题。在负载均衡器处终止SSL并在负载均衡器和Web / app服务器之间使用HTTP非常常见。什么片段不尊重X-Forwarded-Proto?是werkzeug吗?烧瓶? uwsgi?
在我的情况下,我正在使用AWS ELB(设置X-Forwarded-Proto)=> Nginx(它沿着X-Forwarded-Proto转发到uwsgi)。但是在python应用程序中,我必须按照上面引用的问题中描述的Flask Request子类。
由于这是一种常见的部署方案,似乎应该有更好的解决方案。我错过了什么?
你错过了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_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-*
配置。
另请注意,在Werkzeug 0.15中,ProxyFix
中间件的功能已经大大扩展;除了X-Forwarded-Proto
,-For
和-Host
之外,还查阅了X-Forwarded-Port
和-Prefix
标题,所有标题都支持多个值。