为什么Varnish缓存ESI片段(当我不告诉它时)?

时间:2014-03-23 22:07:54

标签: caching varnish varnish-vcl esi

我遇到了Varnish ESI的一个特殊问题。

我网站上的每个页面都有一个ESI片段,用于显示(已登录)用户的帐户信息。

看起来Varnish正在返回用户会话ESI片段的缓存结果,除非浏览器发送一个Cache-Control:no-cache / Pragma:no-cache(强制刷新),当它从中请求ESI内容时服务器

我的vcl_recv包含绕过此规则的规则:

if(req.url ~ "^/session-header") {
    return(pass);
}

vcl_fetch也有一条规则:

if(req.url ~ "^/session-header") {
    return(hit_for_pass);
} else {
  set beresp.ttl = 1h;
}

基本上,这是浏览器方面的行为:

缓存控制:max-age = 0 => Varnish返回缓存的ESI片段

缓存控制:no-cache / Pragma:no-cache => Varnish从服务器中提取ESI片段

我似乎无法弄清楚,我有一种感觉,我错过了一些相当明显的配置。

2 个答案:

答案 0 :(得分:1)

如果有人看到这个,就找出了问题。

事实证明后端正在设置Etag,Varnish用它来决定是否从服务器提供新的ESI片段(浏览器会在If-None-Match请求heeader中发送此Etag,除非它是强制刷新)。

我只是将这一行添加到vcl_deliver,现在它就像一个魅力!

subl vcl_deliver {
  ...
  unset resp.http.Etag;
  ...
}

答案 1 :(得分:-1)

我不得不敲击esi模板的If-Modified-Since和If-None-Since请求标头,以防止提供esi-assemble输出。

sub vcl_recv {
...
      unset req.http.If-Modified-Since;
      unset req.http.If-None-Match;
...
}