我遇到了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片段
我似乎无法弄清楚,我有一种感觉,我错过了一些相当明显的配置。
答案 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;
...
}