使用Varnish + Apache将login用户redirect到https,匿名到http

我在Drupal前面的Apache前面有一个清漆服务器。

我想要做的是将我的login表单redirect到https(很简单),然后将所有已login(已authentication)的用户始终redirect到https,同时将匿名访问者始终redirect到http(出于性能原因) 。

我不希望经过身份validation的用户在点击http://mysite.com/some/page- >的绝对链接时拥有混合模式的体验,因此,如果协议不是通过https身份validation,那么总是会将已通过身份validation的用户redirect到https HTTPS。

是否有可能使用某种组合的Varnish + Apacheconfiguration来做这样的事情? 或者是唯一的解决scheme,所有的访问者(这是所有这些匿名访问者不必要的性能打击)。

对于参考点,我使用了基于这个由四个厨房提供的缺省Drupal敏感示例的Varnish vcl: https ://fourkitchens.atlassian.net/wiki/display/TECH/Configure+Varnish+3+for+Drupal +7

你想要做的事情是很难得到正确的。 如果您在使用http时以及在使用https时出现错误,则可能会导致大量安全问题。

我的build议是在apache中configuration一个http vserver,它会redirect到同一个https URL,而不会做其他事情。 它甚至不需要知道URL是否存在,它只是一直redirect。 然后有另一个https虚拟服务器,它具有该网站的真实内容。

请记住将所有Cookie标记为安全的,这样您就不会在http连接上泄漏cookie。

如果你坚持要通过http来响应没有login的用户,那么你将需要一个不安全的cookie,告诉用户是否login。 不要把任何数据放入这个cookie,只要用户login就存储。 您可以使用0或1作为存储值。 或者您可以使用一个常数值,在这种情况下,cookie的存在意味着用户已经login,缺席意味着用户没有login。

在http端,如果满足这两个条件中的任何一个,则redirect到https。 有一个cookie指示用户login或请求URI需要login。 当收到https请求时,您必须执行额外的检查来validation用户是否真正login。为此,您需要使用安全cookie,这是外人无法猜测的。 如果发现用户没有login,则您redirect回http,如果URL不需要login,并且在这个阶段您指示浏览器删除不正确的表示用户login的不安全cookie。

确保这些redirect不被caching是非常重要的。 您绝对不希望浏览器将URL的http版本redirect到https版本,反之亦然。