如何使Varnish忽略,而不是删除cookie

时间:2010-11-25 04:30:36

标签: http caching cookies varnish

我想使用Varnish来缓存某些页面,即使存在cookie也是如此。我需要处理3种可能性:

  1. 匿名用户正在查看某个页面
  2. 登录用户正在查看具有轻量级自定义功能的页面。这些自定义项都存储在已签名的cookie中,并由Javascript动态填充。 vary-cookie http标头未设置。
  3. 登录用户正在查看包含数据库中自定义数据的某个页面。设置了vary-cookie http标头。
  4. 预期的行为是:

    1. 缓存页面。这是Varnish要处理的最基本方案。
    2. 缓存页面,不要删除cookie,因为有些Javascript逻辑需要它。
    3. 永远不要缓存此页面,因为vary-cookie表示cookie内容会影响此页面的输出。
    4. 我已经阅读了一些关于Varnish的文档,我不知道这是否是默认行为,或者我是否需要在VCL中进行一些设置以实现它。

1 个答案:

答案 0 :(得分:18)

只有会话对每个客户都是唯一的,不一定是cookie。

你想要的东西是有意义的,并且可以使用Varnish,这只是一个精心制作你自己的vcl的问题。请注意default.vcl的以下部分:

sub vcl_recv {
    ...
    if (req.http.Authorization || req.http.Cookie) {
      /* Not cacheable by default */
      return (pass);
    }
}


sub vcl_hit {
    if (!obj.cacheable) {
        return (pass);
    }
    ...
}


sub vcl_fetch {
    if (!beresp.cacheable) {
        return (pass);
    }
    if (beresp.http.Set-Cookie) {
        return (pass);
    }
    ...
}

你必须用自己的逻辑替换这些部分;即定义您自己的vcl_函数。默认情况下,带cookie的请求(vcl_recv)和响应(vcl_fetch)不可缓存。您最了解后端应用程序,并且应该将通用缓存逻辑重写为此特定情况。也就是说,您应该定义清漆在哪种情况下进行查找,传递或传递。

在您的情况下,您将拥有没有变更cookie的页面(案例1和2),每个人都会缓存和共享(带/不带cookie的请求);只是不介意vcl_recv中的req.http.Cookie。我不会用变化的cookie来缓存页面(案例3) - 或者至少不会很长时间 - 因为它们根本不能共享;在vcl_fetch中执行'pass'。