使用Varnish缓存受密码保护的数据

时间:2012-03-14 20:42:33

标签: caching varnish

我想仅向具有管理权限的用户提供生成的资源,我希望Varnish为我缓存它,因此后端不必在每次请求时重新生成它。我不想在后端执行缓存,因为我有Varnish用于此目的。

这是我的后端所做的伪代码:

if (authenticated(cookie)) 
{
    if (stale)
    {
        regenerate_and_send()
    }
    else
    {
         not_modified()
    }
}
else
{
     access_denied()
}

所以我想到Varnish执行验证(条件GET)和后端响应"未修改","访问被拒绝"或" 200 OK" HTTP状态(当然在最后一种情况下重新生成资源)。

我需要Varnish将cookie传递给后端,但是在将资源存储在缓存中时忽略cookie,因此只存储一个副本。

我该怎么做?

易于执行验证并编写后端逻辑。我如何处理Varnish中的cookie,这样它们不会影响缓存,但仍会传递到后端?

1 个答案:

答案 0 :(得分:1)

默认情况下,如果请求有cookie,Varnish将不会查看缓存,因此您必须编写自己的vcl配置文件。

如果我正确理解您的问题,可以将相关资源提供给所有管理员特权用户。这里的故事是;每个用户都有一个不同的会话cookie,而varnish无法知道哪个会话cookie是管理员特权的。你可以做(​​至少)两件事:

  1. 如果用户获得管理员权限,请设置“admin = yourmagicstringhere”Cookie。使Varnish能够验证magicstring是否正确,并相应地为资源执行查找/获取请求。这有一些安全方面的缺点但有效。
  2. 始终将请求转发到后端(无需在缓存中查找/存储),后端生成< ESI:include“real-url”>请求用户是否为admin-privileged,已解决。除了ESI之外,您可以让后端生成其他一些OK响应并重新启动,您可以在其中执行查找/获取/传递。