2016-07-15 12 views
2

Hintergrund:
Ich versuche cloudflare flexible SSL mit django zu konfigurieren.
Browser < -HTTPS-> Cloudflare < -HTTP-> Nginx < -> GunicornNginx + gunicorn Django 1.9 CSRF Überprüfung fehlgeschlagen

Ausgabe:
Ich erhalte CSRF Überprüfung fehlgeschlagen. Anfrage abgebrochen für Admin-Panel-Login - Für jetzt ist dies die einzige POST-Anfrage auf meiner Website. (glauben Sie mir, ich habe hier durch Tonnen Beiträge abgeschöpft und auf Kern, aber nichts scheint für mich zu arbeiten :()

Konfigurationen:

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
Alles funktioniert gut aus Chrome Incognito-Modus!

Update # 2 (Lösung)
Scheint, wie es Cookie Problem war, ich alle Cookies von meinem Browser gelöscht und seine jetzt gut funktioniert !!
Teilweise könnte es auch SECURE_PROXY_SSL_HEADER Frage sein, wie es

+0

Wird die Seite von Cloudflare zwischengespeichert? – frlan

+0

Überprüfen, ob Cloudflare POST-Anfragen nicht zu ersetzen GET – Jerzyk

+0

@frlan Ich habe deaktiviert HTML-Caching in cloudflare – John

Antwort

1

in meinem settings.py falsch war Es scheint, dass Sie einen Fehler gemacht haben, während http-Header zu benennen. Sie müssen sicherstellen, dass der Name der X-Forwarded-Proto Header in beide richtig ist: nginx Konfiguration und Django ‚s settings.py.

So sollten Sie Ihre settings.py Datei ändern, indem Sie die Zeile ersetzt:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 

mit dieser:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 

Oder Sie können hinzufügen, Konfigurationsdatei, die auf nginx Zeile unten:

proxy_set_header X-Forwarded-Protocol https; 
+0

Mein Standort Block sieht jetzt so aus, ist dies richtig ? Ich habe versucht, nginx und gunicorn neu zu starten, aber der Fehler bleibt bestehen. '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-Weitergeleitet-Proto https; } ' – John

+0

Ich habe gerade die Antwort bearbeitet. Es scheint, dass Sie einen Fehler im Header-Namen haben. Versuchen Sie, HTTP_X_FORWARDED_PROTO in settings.py mit Ihrer ursprünglichen nginx-Konfigurationsdatei zu verwenden. – frist

+0

Ich habe beide Möglichkeiten versucht, aber der Fehler bleibt bestehen. Auch wenn ich SSL (CSRF_COOKIE_SECURE - FALSE setzen) deaktivieren, ist der Fehler immer noch da. – John

0

Ich bekam den gleichen Fehler in einem vergleichbaren Setup ohne Cloudflare: Nginx -> Gunicorn -> Django.

ich das Problem beheben, indem Sie diese Einstellung ändern Nginx:
proxy_set_header X-Forwarded-Proto https;
Um dies:
proxy_set_header X-Forwarded-Proto $scheme;

So, dass die Regelung nicht hartcodiert, sondern von der Anfrage abgeleitet.