即使在cookie存在的情况下,我也想使用清漆来缓存某些页面。我需要处理3种可能性:

  1. 匿名用户正在查看某些页面
  2. 登录的用户正在查看一些具有轻度自定义的页面。这些自定义都存储在签名的cookie中,并由JavaScript动态填充。未设置各种cookie HTTP标头。
  3. 登录的用户正在查看一些页面,其中包含来自数据库的自定义数据。设置了各种cookie HTTP标头。

预期的行为将是:

  1. 缓存页面。这是清漆要处理的最基本情况。
  2. 缓存页面,不要删除cookie,因为某些JavaScript逻辑需要它。
  3. 切勿缓存此页面,因为Vary-Cookie信号表明Cookie内容会影响此页面的输出。

我已经阅读了一些有关Varnish的文档,我无法确定这是否是默认行为,或者是否需要在VCL中进行一些设置才能实现它。

有帮助吗?

解决方案

每个客户端仅是独有的,不一定是cookie。

您想要的是有意义的,并且在清漆中可能是可能的,这只是仔细制作自己的VCL的问题。请注意默认值的以下部分: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);
    }
    ...
}

您必须用自己的逻辑替换这些部分; IE定义您自己的VCL_函数。默认情况下,带有cookie的请求(VCL_RECV)和响应(VCL_Fetch)不可缓存。您最了解您的后端应用程序,应该将通用的缓存逻辑重写为此特定情况。也就是说,您应该定义在这种情况下进行查找,通过或交付。

在您的情况下,您将拥有没有变化的cookie的页面(案例1和2),每个cookie都会由每个人都缓存和共享(带有/没有cookie的请求);只是不要介意vcl_recv中的req.http.cookie。我不会使用不同的cookie缓存页面(案例3),也不会长时间不长,因为它们根本无法共享;在vcl_fetch中进行“通行证”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top