Django+;apache:HTTPS仅用于登录页面

Django+;apache:HTTPS仅用于登录页面,django,apache,https,Django,Apache,Https,我正在尝试完成以下行为: 当用户通过以下方式访问站点时: http://example.com/ 我希望他被重新定向到: https://example.com/ 通过中间件,如果用户未登录,则在访问/时呈现登录模板。如果用户已登录,/是主视图。当用户登录时,我希望站点通过http工作 为此,我在端口80和443上运行同一台服务器(这真的有必要吗?我的印象是,我在用同一个应用程序运行两台不同的服务器,而我希望一台服务器监听两个端口) 当用户离开登录时,由于重定向到http服务器,request.

我正在尝试完成以下行为:

当用户通过以下方式访问站点时:
http://example.com/
我希望他被重新定向到:
https://example.com/

通过中间件,如果用户未登录,则在访问
/
时呈现登录模板。如果用户已登录,
/
是主视图。当用户登录时,我希望站点通过http工作

为此,我在端口80和443上运行同一台服务器(这真的有必要吗?我的印象是,我在用同一个应用程序运行两台不同的服务器,而我希望一台服务器监听两个端口)

当用户离开登录时,由于重定向到http服务器,request.session中的数据不存在(尽管它在https上存在),因此表明没有用户登录。因此,考虑到apache的设置是正确的(在两个不同的端口上运行相同的服务器),我想我必须将cookie从运行https的服务器传递到http


有人能解释一下吗?谢谢

首先确保设置会话\u COOKIE\u SECURE设置为false。只要域相同,浏览器上的cookie就应该存在,因此会话信息应该仍然存在

使用插件查看您的cookie。搜索已设置的会话cookie。默认情况下,Django将这些cookie命名为“sessionid”。确保域和路径实际上对于安全会话和常规会话都是正确的

不过,我想提醒大家不要这样做。最近,像Firesheep这样的东西利用了一个人们早已知道但却长期忽视的问题,即这些饼干在任何方面都不安全。对某人来说,通过HTTP连接“嗅探”cookie并作为您的登录用户访问该站点是很容易的。这基本上消除了您首先设置安全连接以登录的全部原因

您没有在整个站点上建立安全连接的原因是什么?关于它在服务器上更加密集的传统观点已经不再适用于现代CPU,我上面提到的漏洞利用已经变得如此普遍,以至于加密所有流量的边际(真正边际)成本是值得的

Apache需要有2台不同的服务器运行,因为a.)它正在监听2个不同的端口,b.)其中一台正在添加一些额外的加密逻辑。也就是说,这对Apache来说是正常的。我运行的服务器有几十个“服务器”,它们运行在不同的端口上,执行不同的逻辑。从总体上看,这不应该让你的服务器负担过重

也就是说,一旦您将相同的请求传递给*WSGI或mod_python,您就必须有逻辑来确保没有人试图通过您的非加密连接登录,因为与Django的唯一区别是request.is_secure()中的响应。urlconf中的所有URL和视图都可以访问


哎呀,太多了。我希望这能有所帮助。

谢谢你的回答。但是,如果我将SESSION\u COOKIE\u SECURE设置为false,则在https模式下无法登录,因为COOKIE不被接受,不是吗?(我已尝试,无法登录)。我只在登录时使用https,以避免以明文形式发送密码,这是由于应用程序的一些必要条件。顺便说一下,其中一个原因是在整个应用程序中使用https的强度。我现在很好奇如何实现第一个想法(正如我读到的yahoo mail以这种方式运行)SESSION_COOKIE_SECURE是在COOKIE上设置的一个标志,它告诉浏览器只能通过安全连接发送COOKIE。这是特别的,所以发送cookie的目的不是为了接受我们正在讨论的问题。它不应影响您登录到安全站点。以明文发送会话cookie与以明文发送密码相同。所有授予的特权都是相同的。这是雅虎的一个主要问题,也是为什么我可以进入星巴克,以任何当前登录雅虎(或Facebook或twitter,但没有安全连接)的人的身份登录。