一个回答提到了中间件解决方案,但有以下警告:
Server Fault上关于nginx重写为https的问题,也提到了POST丢失数据的问题,而我对nginx不够熟悉,无法确定解决方案的有效性。 EFF推荐使用HTTPS-only的说明如下:Django无法在保留POST数据的同时执行SSL重定向。 请设置视图,以便重定向仅在GET期间发生。
像Django-auth这样的应用程序是否具有设置cookie为Secure的功能?还是我需要编写更多的中间件?应用程序在设置cookie时必须设置Secure属性。此属性指示浏览器仅通过安全(HTTPS)传输发送cookie,永远不会通过不安全的(HTTP)传输发送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中测试它时,我首先收到以下消息:
您即将被重定向到一个不安全的连接 - 是否继续?
点击“是”后,立即出现以下内容:
您即将查看通过安全连接的页面 - 是否继续?
尽管第二个IE警告有一个关闭选项 - 但第一个警告没有,因此每当有人搜索并被重定向到结果页面时,他们至少会收到一条警告消息。
HTTP_X_FORWARDED_PROTO
而不是HTTP_X_FORWARDED_PROTOCOL
,这会有影响吗? - meshyis_secure()
检查scheme
属性,该属性调用_get_scheme(self)
,而WSGIRequest
应该实现_get_scheme(self)
,它执行return self.environ.get('wsgi.url_scheme')
。并且 - 您猜对了 - uwsgi相应地填充了此环境变量。 - PF4Public