【发布时间】:2014-05-01 02:58:26
【问题描述】:
我遇到了 Varnish ESI 的一个特殊问题。
我网站上的每个页面都有一个 ESI 片段,用于显示(已登录)用户的帐户信息。
看起来 Varnish 正在返回用户会话 ESI 片段的缓存结果,除非浏览器发送一个 Cache-Control: no-cache / Pragma: no-cache (force refresh) ,这是当它从服务器。
我的 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 片段
我似乎无法弄清楚,我感觉我错过了一些相当明显的配置。
【问题讨论】:
-
万一有人看到这个,就知道问题所在了。原来我的后端设置了 Etag,Varnish 用它来决定是否提供新的 ESI 片段。我只是将这一行添加到 vcl_deliver ,现在它就像一个魅力! sub vcl_deliver { ... unset resp.http.Etag; ... }
标签: caching varnish varnish-vcl esi