CSRF django nginx与cloudflare的ssl

背景

我正在尝试configuration我的Django应用程序以使用cloudflare提供的ssl。 我与这个答案大致相同的设置,并遵循相同的解决scheme。

问题:

这已经杀了我几个星期( 请帮助! ),因为我不是一个networking/安全的人,只是需要一个解决scheme,可以避免我欺骗我的眼睛,但保持网站的安全。

我目前正在得到一个CSRF问题,其中https://www.domain.co.uk不匹配https://domain.co.uk

configuration

Settings.py

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) USE_X_FORWARDED_HOST = True 

nginx的:

 server { listen 80 default_server; server_name domain.co.uk www.domain.co.uk; access_log off; location /static/ { alias /static/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; } } 

Cloudflare DNS:

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

奖金

另外,我也有.com域名,并想知​​道如何最好地设置这个,所以它也是ssl。

    您需要设置发送CSRF cookie的域名。 尝试在您的设置CSRF_COOKIE_SECURE设置为".domain.co.uk" CSRF_COOKIE_DOMAIN ".domain.co.uk"并将CSRF_COOKIE_SECURE设置为True

    第四点值得一读https://docs.djangoproject.com/en/1.9/ref/csrf/#how-it-works

    就个人而言,我会把你的配置在nginx端,而不是Django端。 这样,当你做本地开发,你可以验证你的CSRF,并确保一切正常。 确保它能工作…如果你不能在没有nginx配置的情况下在本地工作,那么还有另一个与你的服务器配置无关的问题。 然后应该可以使服务器上的所有工作都以相同的方式进行,而不需要特定的Django设置或库。

    对于你的nginx配置,解决方案可能是给我们一个这样的答案 301重定向所有www。 到非www,以及所有http重定向到https。

    然后,你可以在你的nginx中重命名这行:

     server_name domain.co.uk www.domain.co.uk; 

    至:

     server_name domain.co.uk; # This assumes you're directing www. to non-www 

    这应该可以解决你的CSRF问题…因为你只会像上面那样引用一个域名和两个域名。

    301重定向的附加好处是,您可以避免任何重复的内容处罚有机搜索。

    [编辑]它看起来像你使用CNAME重定向www。 到非www,所以你可以简单地使用从上面引用的答案的https到非https 301重定向。