Varnish:忽略一些用于哈希计算的缓存 cookie

Varnish: ignore some cache cookies for hash computation

情况::

  1. 即使请求中存在 cookie,Varnish 也需要缓存。
  2. 请求可能包含 N 个任意 cookie,其中某些已知 cookie 不得构成缓存键的一部分。任意 cookie 不包含任何用户敏感数据,例如。他们是像is_authenticated=1.
  3. 这样的美容小帮手
  4. 在缓存未命中的情况下,实际后端必须接收未受干扰的原始 cookie 集。
  5. 我不想在 VCL 中检查 URL 模式,因为这假设对后端有太多了解。

这出乎意料地难以解决。到目前为止,我发现的所有解决方案都假定 (2) 有一个白名单,而我需要一个黑名单。大多数解决方案都会删除本应传送到后端的 cookie。

那么(未测试):

# We use builtin.vcl logic and 'return' from our vcl_recv in order 
# to prevent default Varnish behaviour of not caching with cookies present
sub vcl_recv {
    # your vcl_recv starts here
    # ...
    # your vcl_recv ends here

    if (req.method == "PRI") {
    /* We do not support SPDY or HTTP/2.0 */
        return (synth(405));
    }
    if (req.method != "GET" &&
      req.method != "HEAD" &&
      req.method != "PUT" &&
      req.method != "POST" &&
      req.method != "TRACE" &&
      req.method != "OPTIONS" &&
      req.method != "DELETE") {
        /* Non-RFC2616 or CONNECT which is weird. */
        return (pipe);
    }

    if (req.method != "GET" && req.method != "HEAD") {
        /* We only deal with GET and HEAD by default */
        return (pass);
    }
    if (req.http.Authorization) {
        /* Not cacheable by default */
        return (pass);
    }
    return (hash);
}

sub vcl_hash {
    set req.http.X-Cookie-Hash = regsub(req.http.cookie, "KNOWN1=[^;]+;", "");
    set req.http.X-Cookie-Hash = regsub(req.http.X-Cookie-Hash, "KNOWN2=[^;]+;", "");
    hash_data(req.http.X-Cookie-Hash);
}

它会删除每个已知的 cookie 并对剩余部分进行哈希处理 :) 不理想,因为它不能保证 header 中 cookie 的顺序,但其他的应该有效。