4

介绍

Cloudflare 现在免费提供 SSL,如果我不在我的网站上利用这一点,我将是一个傻瓜,而一个彻头彻尾的白痴会在尝试的过程中破坏一切。

我可以很好地编写应用程序,但是在设置或配置 https/nginx/gunicorn/etc/idon'tknowtheterminology 时,我知道的内容几乎不足以按照 Google 搜索的说明进行操作。

问题

我想使用 django-sslify 在我的 Django Web 应用程序上强制使用 https。鉴于以下已知事实,我如何在不破坏生活平衡的情况下实现这一目标?

已知事实

  1. 我正在使用 Django 1.7,在连接到(免费)Cloudflare DNS 的 DigitalOcean 服务器上运行。Django 配备(服务?) nginx 和 gunicorn。基本上按照本指南进行设置。
  2. 访问我的网站当前默认使用常规的http://example.com标头。
  3. 手动访问https://example.com可以使用绿色锁,但这会破坏所有表单提交,并出现错误“(403) CSRF 验证失败。请求中止。”。
  4. 在我的 Cloudflare 站点设置中,域当前配置为“灵活 SSL”。
  5. 尝试在我现有的设置中使用 django-sslify 完全破坏了一切,并且浏览器无法返回响应。
  6. 此信息块告诉我,在将 django-sslify 与 Cloudflare 的 SSL 结合使用时,我应该使用“完整 SSL”配置设置。
  7. 犹豫的原因在这里找到,其中提到需要 20 美元/月的 Pro Cloudflare 帐户来处理 SSL 终止。所以我真的不想搞砸这个:/
  8. 在我的 nginx 和 gunicorn 配置中,特别是在我的 nginx 配置中,只有 1 处提到了“http”或“https”:

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

好吧,我想这就是我所拥有的

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

4

1 回答 1

4

CloudFlare 允许您启用特定的页面规则,其中之一是强制 SSL(通过执行硬重定向)。除了 django-sslify或之外,这是一件很棒的事情django-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变量而不是$hostor $host:$server_port。这将确保 Django 仍然尊重非标准端口上的 CSRF 请求,同时仍然为您提供正确的绝对 URL。

与大多数与 nginx 和 gunicorn 相关的事情一样,YMMV 和几次之后会变得更容易。

于 2014-12-25T20:23:54.640 回答