如何使用django-sslify在我的Django + nginx + gunicorn web应用上强制使用https,并依靠Cloudflare的新的免费SSL?

介绍

Cloudflare现在免费提供SSL ,如果不在我的网站上充分利用这个function,我会是一个傻瓜,在尝试的过程中,一个彻头彻尾的傻瓜可以打破一切。

我可以编写应用程序,但是在设置或configurationhttps / nginx / gunicorn / etc / id知道这个术语时,我只知道遵循Googlesearch的说明。

我想使用django-sslify在我的Djangonetworking应用上强制使用https。 鉴于以下已知事实,我怎样才能达到这一目标, 而不会破坏我生活的平衡

已知的事实

  1. 我使用Django 1.7,在连接到(免费)Cloudflare DNS的DigitalOcean服务器上运行。 Django与nginx和gunicorn配合(服务?)。 基本上按照这个指南来完成所有的设置。
  2. 访问我的网站目前默认为一个普通的http://example.com标题。
  3. 手动访问https://example.com使用绿色锁和全部,但是这打破了所有表单提交的错误“(403)CSRFvalidation失败,请求中止”。
  4. 在我的Cloudflare站点设置中,该域当前configuration为“灵活的SSL”。
  5. 试图用我现有的设置使用django-sslify完全打破了一切,浏览器无法返回响应。
  6. 这个信息块告诉我,当使用Cloudflare的SSL使用django-sslify时,我应该使用“Full SSL”configuration设置。
  7. 在这里 ,犹豫不决的原因是提到需要一个20美元/月的Pro Cloudflare账户来处理SSL终止。 所以我真的不想把这个搞砸了:/
  8. 在我的nginx和gunicornconfiguration中,只有一处提到“http”或“https”,特别是在我的nginxconfiguration中:

location / { proxy_pass http://127.0.0.1:8001; ... } proxy_pass http://127.0.0.1:8001; ... }

好的,我认为这就是我所拥有的

另外,我的服务器正在为Phonegap应用程序提供一个Django Rest Framework API,是否需要考虑? 如果我需要提供附加信息,请告诉我,我会尽快回复您。 谢谢你看看这个! 🙂

CloudFlare允许你启用特定的页面规则 ,其中之一就是强制SSL(通过硬重定向 )。 除了 django-sslifydjango-secure 之外,这是一件好事


除了设置SSL重定向之外,还需要告诉Django处理安全请求。 幸运的是, Django为此提供了一个体面的指南 ,但是有一些事情没有提到,但是我必须用nginx来做。

在您的Django设置中,您需要告诉Django如何检测安全请求

 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 

在你的nginx配置中,你需要设置X-Forwarded-Protocol头(和X-Forwarded-For / X-Scheme头也是有用的)。

 proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

您还需要代理Host头,因此Django能够读取正确的主机和端口,用于生成绝对URL和CSRF等等。

 proxy_set_header Host $http_host; 

请注意,我使用$http_host变量而不是$host$host:$server_port 。 这将确保Django仍然尊重CSRF对非标准端口的请求,同时仍然给你正确的绝对URL。

与大多数与nginx和gunicorn相关的东西,YMMV,它会变得更容易,你做了几次。