使用 Varnish+Apache 将登录用户重定向到 https,匿名用户重定向到 http

使用 Varnish+Apache 将登录用户重定向到 https,匿名用户重定向到 http

我在 Apache 和 Drupal 前面有一台装有 Varnish 的服务器。

我想要做的是将我的登录表单重定向到 https(很容易),然后将所有登录(经过身份验证)的用户始终重定向到 https,同时让匿名访问者始终重定向到 http(出于性能原因)。

我不希望经过身份验证的用户在点击绝对链接时获得混合模式的体验http://mysite.com/some/page-> 所以这就是如果协议不是 https 则始终将经过身份验证的用户重定向到 https 的原因。

是否可以使用 Varnish + Apache 配置的某种组合来实现类似的目的?或者这里唯一的解决方案是让所有访问者始终使用 https(这对所有匿名访问者来说是不必要的性能损失)。

作为参考,我使用基于 Four Kitchens 提供的默认 Drupal 敏感示例的 Varnish vcl:https://fourkitchens.atlassian.net/wiki/display/TECH/Configure+Varnish+3+for+Drupal+7

答案1

您要做的事情很难正确完成。如果您在使用 http 和 https 时犯了错误,可能会引发许多安全问题。

我的建议是在 apache 中配置一个 http vserver,它会重定向到相同的 https URL,而不执行任何其他操作。它甚至不必确定 URL 是否存在,它只是一直重定向。然后有另一个 https vserver,它有网站的真实内容。

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

如果您坚持通过 http 响应未登录的用户,那么您将需要一个不安全的 cookie,用于判断用户是否已登录。不要将任何数据放入此 cookie,只需存储用户是否已登录即可。您可以使用 0 或 1 作为存储值。或者您可以使用常量值,在这种情况下,cookie 的存在表示用户已登录,不存在表示用户未登录。

在 http 端,如果满足这两个条件之一,则重定向到 https。有一个 cookie 指示用户已登录或请求 URI 需要登录。收到 https 请求后,您必须进行其他检查以验证用户是否确实已登录。为此,您使用安全的 cookie,外部人员无法猜测。如果发现用户未登录,则重定向回 http(如果 URL 不需要登录),此时您指示浏览器删除不安全的 cookie,该 cookie 错误地指示用户已登录。

确保这些重定向不会被缓存,这一点非常重要。你绝对不希望浏览器缓存从 URL 的 http 版本到 https 版本的重定向,反之亦然。

相关内容