2

我遇到了 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;
}

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

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

Cache-Control: no-cache / Pragma: no-cache => Varnish 从服务器获取 ESI 片段

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

4

2 回答 2

1

万一有人看到这一点,找出问题所在。

原来后端设置了 Etag,Varnish 用它来决定是否从服务器提供新的 ESI 片段(浏览器会在 If-None-Match 请求头中发送这个 Etag,除非它是强制刷新)。

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

subl vcl_deliver {
  ...
  unset resp.http.Etag;
  ...
}
于 2014-03-24T17:48:58.300 回答
-1

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

sub vcl_recv {
...
      unset req.http.If-Modified-Since;
      unset req.http.If-None-Match;
...
}
于 2015-02-10T19:47:54.410 回答