启用cookie时,Varnish不会缓存

时间:2013-05-28 11:33:29

标签: varnish

我使用Varnish 3,网站是wordpress。 问题是当我删除所有cookie和set-cookie头时,varnish缓存很好。 但是我需要根据cookie来制作清漆来缓存页面。 (我的网站内容取决于地理位置,因此当用户第一次登录时,我添加cookie'revenive_country') 首先,我删除所有set-cookies标头:

# Drop any cookies Wordpress tries to send back to the client.
sub vcl_fetch {
    if (!(req.url ~ "wp-(login|admin)")) {
          unset beresp.http.set-cookie;
    }
}

然后: 默认情况下,varnish不会缓存具有cookie的请求。这是通过默认的vcl_fetch逻辑完成的。所以我更改了默认的vcl_fetch并注释掉了cookie禁令(参见/*|| req.http.Cookie*/):

sub vcl_recv {
 if (req.restarts == 0) {
   if (req.http.x-forwarded-for) {
       set req.http.X-Forwarded-For =
           req.http.X-Forwarded-For + ", " + client.ip;
   } else {
       set req.http.X-Forwarded-For = client.ip;
   }
 }
 if (req.request != "GET" &&
   req.request != "HEAD" &&
   req.request != "PUT" &&
   req.request != "POST" &&
   req.request != "TRACE" &&
   req.request != "OPTIONS" &&
   req.request != "DELETE") {
     /* Non-RFC2616 or CONNECT which is weird. */
     return (pipe);
 }
 if (req.request != "GET" && req.request != "HEAD") {
     /* We only deal with GET and HEAD by default */
     return (pass);
 }
 if (req.http.Authorization /*|| req.http.Cookie*/) {
     /* Not cacheable by default */
     return (pass);
 }
 return (lookup);
 }

之后我预计清漆将使用cookie缓存页面,但它不是:-( 但它应该缓存!不是吗?

如果我删除了所有的cookie,它就可以缓存:

sub vcl_recv {
    if (!(req.url ~ "wp-(login|admin)")) {
          remove req.http.Cookie;
    }
}

请帮忙!我花了很多时间来找出它没有缓存的原因

1 个答案:

答案 0 :(得分:3)

除了您注释掉的部分之外,默认VCL中没有任何内容可以防止varnish缓存对包含cookie的请求的响应。但是,后端服务器仍需要在标头中指示varnish来缓存给定页面。在wordpress中渲染页面时,您希望清除缓存,将此标题添加到响应中:

Cache-Control: public, max-age=600

600表示缓存此页面10分钟,86400表示1天,等等。如果这样做,您必须非常小心,不要使用请求中的地理位置cookie来生成任何部分响应,否则所有用户将收到相同位置的内容,任何用户发起缓存请求的位置。如果页面的任何部分需要使用位置cookie,则需要使用esi:include标记对其进行渲染,该标记将生成对后端的单独请求,其结果可以告诉varnish不要缓存。