Похоже, что текущий способ достижения этого - передача x_proto=1
в качестве аргумента промежуточному программному обеспечению Werkzeug ProxyFix:
from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1 ,x_proto=1)
Обязательно установите x_for
правильно, в соответствии с документами . Это значение равно числу прокси и должно быть правильным по соображениям безопасности, иначе Flask может доверять некоторым заголовкам, установленным пользователем Интернета, как если бы они пришли с обратного прокси. Опасность заключается в установке этого значения в 1, когда прокси отсутствует.
Тогда в nginx убедитесь, что вы устанавливаете заголовок X-Forwarded-Proto
в блоке местоположения, перед вашим proxy_pass
:
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:9999/;
}
Я не проверял это с помощью nginx, но смог протестировать непосредственно на сервере dev и gunicorn, настроив этот заголовок специально в curl:
curl -is http://localhost:5000/ -H 'X-Forwarded-Proto: https'
Возвращает:
HTTP/1.0 302 FOUND
Location: https://localhost:5000/test_str/accueil`
Таким образом, похоже, действует url_for
, который не требует изменения отдельных url_for()
вызовов в вашем коде, как в случае с принятым ответом, связанным с @ PGHE.