X-Forwarded-Proto and Flask

У меня точно такая же проблема, описанная в этом SO-вопросе и ответе. Ответ на этот вопрос - хорошая работа, но я не понимаю фундаментальной проблемы. Очень часто встречается прерывание SSL на балансировщике нагрузки и использование HTTP между балансировщиком нагрузки и серверами веб-приложений. Какая часть стека не соблюдает X-Forwarded-Proto? Это werkzeug? Колба? uwsgi?

В моем случае я использую AWS ELB (который устанавливает X-Forwarded-Proto) = > Nginx (который пересылает по X-Forwarded-Proto в uwsgi). Но в приложении python я должен подклассировать запрос на флягу, как описано в вопросе, на который я ссылался выше.

Поскольку это такой общий сценарий развертывания, кажется, что должно быть лучшее решение. Что мне не хватает?

Ответы

Ответ 1

Вам не хватает компонента промежуточного программного обеспечения ProxyFix(). См. Документацию по настройке прокси-сервера Flask.

Не нужно ничего делать подклассом; просто добавьте этот компонент промежуточного программного обеспечения в ваш стек 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 и новее уже используют эту версию).

Этот компонент устанавливает схему WSGI из заголовка X -For warded- Proto. Прочитайте документацию Flask, на которую я ссылался выше, о доверии заголовкам и о настройке промежуточного программного обеспечения для вашей конкретной ситуации. Выше я настроил его так, чтобы он смотрел только на X-Forwarded-Proto, но компонент также может обрабатывать другие X-Forwarded-*.

Также обратите внимание, что функциональность промежуточного программного обеспечения ProxyFix была значительно расширена в Werkzeug 0.15; в дополнение к X-Forwarded-Proto, -For и -Host, к ним также X-Forwarded-Port и -Prefix, все заголовки поддерживают несколько значений.