Flask url_for не использует https за обратным прокси-сервером nginx

У меня есть приложение Flask, работающее на CherryPy локально как http://localhost:5000, которое затем открывается через обратный прокси-сервер Nginx как https://some.website.com

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда мое приложение вызывает redirect(url_for('some.endpoint')), оно возвращает перенаправление http://.

Обычно я исправляю эту проблему с помощью правила перезаписи URL-адресов, но в моем сценарии это невозможно, потому что весь трафик HTTP-порта 80 блокируется на уровне брандмауэра, и сервер принимает только трафик https.

На данный момент мне удалось обмануть это, добавив параметры _external=True, _scheme='https' в функцию url_for, но я постоянно сталкиваюсь с проблемами, такими как нарушение декоратора @login_required, потому что он пытается перенаправить пользователя на http://some.website.com/login, который просто время ожидания после отклонения соединения.

В объекте конфигурации Flask я установил:

PREFERRED_URL_SCHEME = "https"

но это не влияет на проблему.

Я также добавил следующие заголовки в файл nginx.conf:

proxy_set_header   X-Forwarded-For          $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Proto        https;
proxy_set_header   X-Forwarded-Ssl          on;
proxy_set_header   X-Url-Scheme             https; 

что тоже не влияет.

Кто-нибудь с похожей проблемой нашел решение?


EDIT: я включил промежуточное ПО ProxyFix из werkzeig.contrib.fixers, добавив строку flask_app.wsgi_app = ProxyFix(flask_app.wsgi_app) в свое приложение перед вызовом cherrypy.engine.start(), у меня все еще возникает та же проблема даже после перезапуска сервера и очистки всего кеша:

скриншот

Возможно ли, что CherryPy нужны какие-то дополнительные параметры конфигурации?


person Mike    schedule 03.10.2016    source источник