Перенаправление Django SSL на Heroku: «Слишком много перенаправлений»

У меня есть веб-приложение, развернутое в Heroku с собственным доменным именем, DNS которого управляется через CloudFlare.

Я хочу перенаправить запросы HTTP на HTTPS.

После установки для параметра SECURE_SSL_REDIRECT значения True в соответствии с документацией Django. , я сталкиваюсь с ошибкой Too many redirects (или site redirected you too many times) при доступе к сайту через личный домен.

Вот что у меня есть в моем файле settings.py:

SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ('X-Forwarded-Proto', 'https')

Обратите внимание, что это перенаправление работает с доменом myapp.herokuapp.com.

Я использую DNS + Proxy в CloudFlare, и SECURE_PROXY_SSL_HEADER установлен в соответствии с документацией.

Вот журнал Heroku:

2019-04-17T11:21:08.514202+00:00 heroku[router]: at=info method=GET path="/" host=staging.mywebsite.com request_id=cf90ab0c-0895-4faf-aeea-5ee5fe5f970d fwd="115.87.132.194,172.68.242.176" dyno=web.1 connect=0ms service=2ms status=301 bytes=228 protocol=http

person merc1er    schedule 17.04.2019    source источник


Ответы (4)


Насколько я понимаю, Cloudflare использует прокси для ускорения вашего сайта. В сочетании с heroku это приведет к «Слишком много перенаправлений», если прокси включен.

введите описание изображения здесь

Убедитесь, что облако в Cloudflare DNS не имеет оранжевого цвета и не будет использовать прокси перед вашим сервером.

Вы можете настроить SSL в героку, см.: https://devcenter.heroku.com/articles/ssl-endpoint

person S. vanh.    schedule 11.06.2019

Django изменяет формат заголовка, поэтому «X-Forwarded-Proto» становится «HTTP_X_FORWARDED_PROTO», поэтому в вашем примере вы должны заменить 'X-Forwarded-Proto' на 'HTTP_X_FORWARDED_PROTO'.

Из документации Django:

Обратите внимание, что заголовок должен быть в формате, используемом request.META — все заглавные буквы и, вероятно, начинаются с HTTP_. (Помните, Django автоматически добавляет «HTTP_» в начало имен x-заголовков, прежде чем сделать заголовок доступным в request.META.)

Существует также пример для этого точного заголовка.

Установите кортеж с двумя элементами — именем искомого заголовка и требуемым значением. Например:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

Это говорит Django доверять заголовку X-Forwarded-Proto, полученному от нашего прокси-сервера, и каждый раз, когда его значение равно «https», запрос гарантированно будет безопасным (т. е. он изначально пришел через HTTPS).

person jackweath    schedule 21.09.2019

В документации Django есть примечание для SECURE_SSL_REDIRECT. заявив, что:

Если изменение этого параметра на True вызывает бесконечные перенаправления, это, вероятно, означает, что ваш сайт работает за прокси-сервером и не может определить, какие запросы являются безопасными, а какие нет. Ваш прокси, вероятно, устанавливает заголовок для обозначения безопасных запросов; вы можете исправить проблему, выяснив, что это за заголовок, и соответствующим образом настроив параметр SECURE_PROXY_SSL_HEADER .

person svikramjeet    schedule 17.04.2019
comment
Да, именно поэтому я установил SECURE_PROXY_SSL_HEADER, как указано выше. - person merc1er; 17.04.2019

Попробовав несколько подходов к этому и всегда получая ошибку «Слишком много перенаправлений», я просто решил сделать все перенаправления из CloudFlare и удалить их из своего приложения Django.

Вот документация .

person iDrwish    schedule 21.11.2019