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

Jas*_*sta 18 cookies caching http varnish

即使存在cookie,我也希望使用Varnish来缓存某些页面.我需要注意三种可能性:

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

预期的行为是:

  1. 缓存页面.这是Varnish处理的最基本方案.
  2. 缓存页面并且不删除cookie,因为某些Javascript逻辑需要它.
  3. 永远不要缓存此页面,因为vary-cookie表示cookie内容将影响此页面的输出.

我已经阅读了一些关于Varnish的文档,我无法分辨这是否是默认行为,或者我是否需要在VCL中进行一些设置以实现它.

ivy*_*ivy 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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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