在 Django 中强制使用 https

Posted

技术标签:

【中文标题】在 Django 中强制使用 https【英文标题】:Forcing https in Django 【发布时间】:2012-08-01 20:21:31 【问题描述】:

我正在尝试通过 SSL 加密我的整个网站。但是,我没有找到使用 Django 1.4 执行此操作的明确方法。有谁知道解决办法吗?

【问题讨论】:

【参考方案1】:

在 apache+django (1.6) 上,这可以通过多种方式完成,但可以在 .htaccess 或 httpd.conf 文件中完成的一种简单方式是:

RewriteEngine On
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URL

这里有一个链接以获取更多信息:

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

为确保会话和 csrf cookie 不会被客户端通过普通的 http 连接泄露,您应该确保它们被设置为“安全 cookie”并且仅由客户端通过 https 发送。这可以在您的 settings.py 文件中按如下方式完成:

CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True

django 安全性介绍,包括 SSL/HTTPS(必读):

https://docs.djangoproject.com/en/1.6/topics/security/

【讨论】:

【参考方案2】:

您可以使用诸如 django-secure 中提供的中间件,或者您可以通过将所有 HTTP 请求重定向到 HTTPS 在 Apache/nginx/HAProxy 级别处理此问题。

【讨论】:

+1 不过,只需在服务器级别执行此操作。没有理由让 Django 参与这个过程。 如果您混合使用 HTTP 和 HTTPS,那么您很可能需要一个 Django 中间件,但如果一切都将是 HTTPS,那么您确实最好在服务器级别处理它。 不要有争议,但即便如此,我还是会说在服务器级别进行。例如,像大多数人一样,我的管理员仅通过 HTTPS 提供服务,但我网站的其余部分是 HTTP。在我的 nginx conf 中,我只是将任何请求通过 HTTP 重定向到位置 /admin/ 到 HTTPS。 Django 仍然没有参与,也不需要参与。 是的,我理解,但这两种方法都是合理的,即使通过 Django 是次优的。 如何在服务器级别实现它?

以上是关于在 Django 中强制使用 https的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模型字段中强制执行 char(N) 数据类型而不是 varchar(N)

在 Django 中强制使用唯一的字段组合

在 django 中强制执行严格的 sql 模式

Django 强制密码过期

强制在 Django 中使用 PUT 请求只能更改某些属性

如何强制 Django 模型从内存中释放