2016-07-15 1 views
2

Справочная информация:
Я пытаюсь настроить Cloudflare гибкий SSL с Джанго.
Browser < -HTTPS-> Cloudflare < -HTTP-> Nginx < -> GunicornNginx + gunicorn Django 1.9 CSRF проверки не удалось

Выпуск:
Я получаю CSRF проверка не удалась. Запрос отменен для входа в административную панель - Пока это единственный запрос POST на моем веб-сайте. (верить мне, я пробежал тонны сообщений здесь и суть, но ничего, кажется, работает для меня :()

Конфигурации:

Nginx -

listen 80; 
server_name domain.com; 

real_ip_header X-Forwarded-For; 
set_real_ip_from 103.21.244.0/22; 
set_real_ip_from 103.22.200.0/22; 
set_real_ip_from 103.31.4.0/22; 
set_real_ip_from 104.16.0.0/12; 
set_real_ip_from 108.162.192.0/18; 
set_real_ip_from 131.0.72.0/22; 
set_real_ip_from 141.101.64.0/18; 
set_real_ip_from 162.158.0.0/15; 
set_real_ip_from 172.64.0.0/13; 
set_real_ip_from 173.245.48.0/20; 
set_real_ip_from 188.114.96.0/20; 
set_real_ip_from 190.93.240.0/20; 
set_real_ip_from 197.234.240.0/22; 
set_real_ip_from 198.41.128.0/17; 
set_real_ip_from 199.27.128.0/21; 
set_real_ip_from 2400:cb00::/32; 
set_real_ip_from 2606:4700::/32; 
set_real_ip_from 2803:f800::/32; 
set_real_ip_from 2405:b500::/32; 
set_real_ip_from 2405:8100::/32; 
real_ip_header CF-Connecting-IP; 

location/{ 
    proxy_pass http://unix:/var/webapps/run/SBWebsite.sock; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

} 

Django - settings.py

DEBUG = False 
PREPEND_WWW = True 
USE_X_FORWARDED_HOST = True 
CSRF_COOKIE_SECURE = True 
SESSION_COOKIE_SECURE = True 
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 

Cloudflare DNS -

A domain.com points to <ip> Automatic 
CNAME www is an alias of domain.com Automatic 

Page rule is set to always use HTTPS 

Update # 1
Все отлично работает с Chrome Incognito режиме!

Update # 2 (раствор)
Похоже, это был вопрос печенье, я очистил все куки из браузера и теперь его работает отлично !!
Отчасти это может быть также SECURE_PROXY_SSL_HEADER вопроса, как это было неправильно в моем settings.py

+0

Является ли страница кэшированной облачной системой? – frlan

+0

проверить, не заменит ли облачная служба POST-запросов GET – Jerzyk

+0

@frlan У меня отключено кэширование html в cloudflare – John

ответ

1

Кажется, вы сделали ошибку при именовании HTTP-заголовка. Вы должны убедиться, что заголовок X-Forwarded-Proto верен и для обоих: nginx и Django. Settings.py.

Таким образом, вы должны изменить свой settings.py файл, заменив строку:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 

с этим:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 

Или вы можете добавить в файл конфигурации Nginx в ниже:

proxy_set_header X-Forwarded-Protocol https; 
+0

Мой блок местоположений выглядит вот так: это верный ? Я попытался перезапустить nginx и gunicorn, но ошибка сохраняется. 'location/{ proxy_pass http: // unix: /var/webapps/run/SBWebsite.sock; proxy_set_header Host $ 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 https; } ' – John

+0

Я только что отредактировал ответ. Кажется, у вас ошибка в заголовке. Попробуйте использовать HTTP_X_FORWARDED_PROTO в settings.py с исходным файлом конфигурации nginx. – frist

+0

Я пробовал в обоих направлениях, но все же ошибка сохраняется. Даже если отключить SSL (установить CSRF_COOKIE_SECURE - FALSE), ошибка все еще существует. – John

0

Я получал ту же ошибку в сопоставимой настройке без Cloudflare: Nginx -> Gunicorn -> Django.

я могу это исправить, изменив этот параметр Nginx:
proxy_set_header X-Forwarded-Proto https;
Для этого:
proxy_set_header X-Forwarded-Proto $scheme;

Так что схема не жестко, но вместо этого выводится из запроса.