我在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子类。
由于这是一种常见的部署方案,似乎应该有更好的解决方案。我错过了什么?
答案 0 :(得分:31)
您错过了ProxyFix()
middleware component。请参阅Flask Proxy Setups documentation。
没有必要继承任何东西;只需将此中间件组件添加到WSGI堆栈中即可:
try:
# Werkzeug 0.15 and newer
from werkzeug.middleware.proxy_fix import ProxyFix
except ImportError:
# older releases
from werkzeug.contrib.fixers import ProxyFix
from flask import Flask
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
如果你安装了Flask,你也有Werkzeug。
此组件sets the WSGI scheme from the X-Forwarded-Proto header。请阅读我上面链接到的关于信任标题的Flask文档以及根据您的具体情况自定义中间件。
另请注意,在Werkzeug 0.15中,ProxyFix
中间件的功能已经大大扩展;除了X-Forwarded-Proto
,-For
和-Host
之外,还会查询X-Forwarded-Port
和-Prefix
标头,所有标头都支持多个值。