清漆:忽略一些缓存cookie以进行哈希计算

时间:2017-04-08 12:25:43

标签: varnish

场合::

  1. 即使在请求中存在cookie,清漆也需要缓存。
  2. 请求可能包含N个任意cookie,其中某些已知的cookie不得构成缓存密钥的一部分。任意cookie不包含任何用户敏感数据,例如。他们是化妆品助手,如is_authenticated = 1。
  3. 在缓存未命中的情况下,实际后端必须收到未经修改的原始Cookie集。
  4. 我不想检查VCL中的URL模式,因为这假设对后端有太多的了解。
  5. 这令人惊讶地难以解决。到目前为止,我发现的所有解决方案都假定为(2)的白名单,而我需要一个黑名单。大多数解决方案都会删除应该传递给后端的cookie。

1 个答案:

答案 0 :(得分:1)

那么(未经测试)如何:

# 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和哈希值:)不理想,因为它不能保证头部中cookie的顺序,但其他部分应该有效。