У меня есть приложение 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 нужны какие-то дополнительные параметры конфигурации?