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

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

我想使用 Varnish 缓存某些页面,即使存在 cookie。我需要考虑以下三种可能性:

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

预期的行为是:

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

我已经阅读了一些关于 Varnish 的文档,但我无法判断这是默认行为还是我必须在 VCL 中做一些设置才能实现它。

答案1

默认情况下,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);

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

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

如果你的应用程序没有基于 Cookie 生成任何内容,那么忽略它可能是安全的:

-      if (req.http.Authorization || req.http.Cookie) {
+      if (req.http.Authorization) {

做一些测试,你就会掌握窍门。希望这能有所帮助。

答案2

如果我理解正确的话,您不希望特定的 cookie 作为密钥的一部分 - 但您需要保持它完整?

您需要将 vcl_hash 中的哈希设置为 req.url + req.http.host(可能还有其他),但不是特定的 cookie。

我认为我的一篇文章可以帮你找到正确的方向:忽略 Varnish VCL 中的 GET 参数

相关内容