Недавно я работал над приложением django и, наконец, готов к развертыванию в qa и производственной среде. Все работало отлично на месте, но, добавив сложность развертывания в реальном мире, у меня было несколько проблем.Ошибка Django CSRF, обнаруженная Nginx X-Forwarded-host
Первый мой технический стек немного сложнее. Для развертываний я использую aws для всего, где мой сайт развернут на нескольких ec2, поддерживаемых балансировщиком нагрузки. Балансировщик нагрузки защищен с помощью ssl, но соединения с балансировщиком нагрузки перенаправляются на ec2 по стандарту http на порт 80. После удара ec2 на порту 80 они отправляются в контейнер докера на порте 8000 (если вы не знакомы с докер просто считают его стандартным vm). Внутри контейнера nginx слушает порт 8000, он обрабатывает перенаправление для статических файлов в django, а для веб-запросов он отправляет запрос на django, работающий на 127.0.0.1:8001. Джанго в настоящее время размещается uwsgi прослушивает порт 8001.
server {
listen 8000;
server_name localhost;
location /static/ {
alias /home/library/deploy/thelibrary/static/;
}
location/{
proxy_set_header X-Forwarded-Host $host:443;
proxy_pass http://127.0.0.1:8001/;
}
}
Я использую X-Forwarded хозяина, потому что у меня были проблемы с редиректов от Google OAuth и перенаправляет предложит пользователю войти в систему сделать запрос на брАузЕр URL 127,0. 0.1: 8001, который, очевидно, не будет работать. В моем файле settings.py я также включил
USE_X_FORWARDED_HOST = True
Чтобы заставить django использовать правильный хост для переадресации.
В настоящее время общий просмотр сайта отлично работает, загрузка статических файлов, перенаправление работы, а сайт защищен с помощью ssl. Однако проблема заключается в том, что проверка CSRF не выполняется.
На форме представления я получаю следующее сообщение об ошибке
Referer проверки не удался - https://qa-load-balancer.com/projects/new не соответствует https://qa-load-balancer.com:443/.
Я действительно не уверен, что делать с этим, его действительно через вопросы о стеке, которые я получил до сих пор.