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

Jas*_*sta 6 http cache varnish cookies http-cookie

即使存在 cookie,我也想使用 Varnish 来缓存某些页面。我需要注意 3 种可能性:

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

预期的行为是:

  1. 缓存页面。这是 Varnish 处理的最基本场景。
  2. 缓存页面并且不要删除 cookie,因为某些 Javascript 逻辑需要它。
  3. 永远不要缓存这个页面,因为变化 cookie 表明 cookie 内容会影响这个页面的输出。

我已经阅读了一些关于 Varnish 的文档,但我不知道这是否是默认行为,或者我是否必须在 VCL 中进行一些设置才能使其发生。

Thi*_*iro 3

默认情况下,Varnish 不会缓存带有 Cookie 标头的请求:

http://varnish-cache.org/svn/trunk/varnish-cache/bin/varnishd/default.vcl

  sub vcl_recv {
(...)
  if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
    return (lookup);
Run Code Online (Sandbox Code Playgroud)

您需要将所需的行为编码到配置中。请注意,Cookie 是客户端请求的一部分,而不是“页面”(实际上是对象)。“页面”(对象)带有一个“Set-Cookie”标头 - 这就是将被缓存的标头。

另外,“Vary: Cookie”并不意味着“不缓存”。这意味着为接收到的每个 Cookie 值缓存一个对象。

如果您的应用程序没有生成任何基于 Cookie 的内容,则可以安全地忽略它:

-      if (req.http.Authorization || req.http.Cookie) {
+      if (req.http.Authorization) {
Run Code Online (Sandbox Code Playgroud)

做一些测试,你就会掌握它的窍门。希望这可以帮助。