我遇到了 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 片段
我似乎无法弄清楚,我觉得我错过了一些相当明显的配置。