一尘不染

如何使用Django / nginx部署仅HTTPS站点?

django

我最初的问题是如何为Django登录页面启用HTTPS,唯一的回应是建议我- 将整个站点设置为仅HTTPS。

鉴于我正在使用Django 1.3和nginx,将网站设为仅HTTPS的正确方法是什么?

一个回应提到了一个中间件解决方案,但有一个警告:

Django在维护POST数据时无法执行SSL重定向。请整理你的视图,以便仅在GET期间进行重定向。

关于服务器故障的有关nginx重写为https的问题,还提到了POST丢失数据的问题,而我对nginx不够熟悉,无法确定解决方案的工作情况。

和EFF的建议去HTTPS只,注意到:

设置时,应用程序必须在cookie上设置Secure属性。此属性指示浏览器仅通过安全(HTTPS)传输而不是不安全(HTTP)发送cookie。

像Django-auth这样的应用程序是否可以将Cookie设置为安全?还是我必须编写更多的中间件?

因此,就以下方面而言,配置Django / nginx组合以实现仅HTTPS的最佳方法是:

  • 安全
  • POST数据的保存
  • Cookies处理正确
  • 与其他Django应用(例如Django-auth)的交互正常工作
  • 我不知道的其他任何问题:)

编辑 -我在测试多个浏览器时发现的另一个问题。说我有URL https://mysite.com/search/,它有一个搜索表单/按钮。我按一下按钮,处理在Django像往常一样的形式,做一个Django HttpResponseRedirect来http://mysite.com/search?results=”foo”。Nginx https://mysite.com/search?results="foo"根据需要将其重定向到。

但是,重定向发生时,Opera会有可见的闪光。而且它会在每次搜索中发生,即使是对于相同的搜索词(我想https确实不会缓存:)更糟糕的是,当我在IE中对其进行测试时,我首先会收到以下消息:

You are about to be redirected to a connection that is not secure - continue?

单击“是”后,紧接着是:

You are about to view pages over a secure connection - continue?

尽管第二个IE警告选项可以将其关闭-第一个警告则没有,因此每次有人进行搜索并将其重定向到结果页面时,他们至少会收到一条警告消息。


阅读 1001

收藏
2020-03-28

共1个答案

一尘不染

对于John C的答案的第二部分,以及Django 1.4 + …

你可以将更request.scheme改为,而不是扩展HttpResponseRedirect https。因为Django在Nginx的反向代理后面,所以它不知道原始请求是安全的。

在你的Django设置中,设置SECURE_PROXY_SSL_HEADER设置:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

然后,你需要Nginx在反向代理中设置自定义标头。在Nginx网站设置中:

location / {
    # ... 
    proxy_set_header X-Forwarded-Proto $scheme;
}

这样request.scheme == ‘https’并request.is_secure()返回True。 request.build_absolute_uri()返回https://…等等

2020-03-28