使用Varnish缓存仅基于主机

时间:2016-09-04 12:59:52

标签: caching server varnish varnish-vcl

我想将Cookie传递给后端,但我不希望将它们添加到哈希表中。我的目标是仅根据主机提供每个请求。有可能吗?

2 个答案:

答案 0 :(得分:2)

默认情况下,如果未设置主机头,则基于url和host或ip的varnish缓存 - 请参阅内置vcl_hash:

sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return (lookup);
}

如果你没有在vcl_recv函数中取消设置cookie,那么默认情况下,varnish不会缓存响应,因为它将“返回(传递);”在内置的vcl_recv函数中。

sub vcl_recv {
  ...
    if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
    return (hash);
}

如果您不想缓存,那么这样就可以了。

如果你想缓存并需要将cookie发送到后端,那么我猜你必须“返回(哈希);”在您的“vcl_recv”版本中,但只有在响应总是相同的情况下才会有意义,无论发送的cookie如何。

作为旁注:如果您确实要缓存响应,那么您还需要取消设置后端设置的Cookie或避免进入内置的“vcl_backend_response”

答案 1 :(得分:0)

为了将cookie传递给后端并缓存请求,我这样做了:

  1. 从vcl_recv中删除它:

    if (req.http.Authorization || req.http.Cookie) {
    /* Not cacheable by default */
        return (pass);
    }
    
  2. 将此添加到vcl_fetch:

     unset beresp.http.set-cookie;