【问题标题】:How to use django-sslify to force https on my Django+nginx+gunicorn web app, and rely on Cloudflare's new free SSL?如何使用 django-sslify 在我的 Django+nginx+gunicorn Web 应用程序上强制 https,并依赖 Cloudflare 的新免费 SSL?
【发布时间】:2014-12-13 15:24:55
【问题描述】:

简介

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

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

问题

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

已知事实

  1. 我正在使用 Django 1.7,在连接的 DigitalOcean 服务器上运行 到(免费)Cloudflare DNS。 Django 安装(服务?) nginx 和独角兽。基本上按照this guide 进行设置。
  2. 目前访问我的网站默认使用常规的http://example.com 标头。
  3. 手动访问https://example.com 适用于 绿色锁和所有,但这会破坏所有表单提交 错误“(403) CSRF 验证失败。请求中止。”。
  4. 在我的 Cloudflare 站点设置中,域当前配置为“灵活 SSL”。
  5. 尝试在我现有的设置中使用 django-sslify 会完全破坏一切,并且浏览器无法返回响应。
  6. This info nugget 告诉我,在将 django-sslify 与 Cloudflare 的 SSL 结合使用时,我应该使用“完整 SSL”配置设置。
  7. 犹豫的原因找到了here,其中提到需要一个 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,是否需要考虑到这一点?如果我需要提供其他信息,请告诉我,我会尽快回复您。谢谢你看看这个! :)

【问题讨论】:

    标签: django nginx https cloudflare django-sslify


    【解决方案1】:

    CloudFlare 允许您启用特定的page rules,其中之一是强制 SSL(通过doing a hard redirect)。除了django-sslifydjango-secure

    之外,这是一个很好的使用

    除了设置 SSL 重定向之外,您还需要告诉 Django 处理安全请求。幸运的是,Django provides a decent guide 这样做了,但是有几件事它没有提到,但我不得不与 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 做几次后会变得更容易。

    【讨论】:

    • 这个答案给了我很好的追求方向,谢谢!
    • 另一个问题 - SSL 证书如何适合这里?
    • @gx14 CloudFlare 的灵活 SSL 适用于大多数人,除非您想要完全 SSL,否则您不需要购买证书和 configure nginx 来使用它们。
    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 2015-01-07
    • 2018-02-16
    • 1970-01-01
    • 2020-11-15
    • 2016-04-24
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多