如何让Varnish停止缓存ESI片段
我在用 Varnish 3.0 和 repoze.bfg 项目时遇到了一些问题,特别是在使用 ESI 的时候。我有一个 ESI 片段,它会显示给登录用户的通知,这个片段是通过 ESI 标签包含进来的。但是,Varnish 会把这个 ESI 片段缓存起来,所以无论是手动修改还是因为会话变化所做的更改,都不会在包含这个片段的网页上显示出来,因为网页是从缓存中取的。
使用的 ESI 标签如下:
VCL 配置:
sub vcl_recv {
if (req.url ~ "[A-Za-z0-9_-]*.esi$") {
return (pass);
}
if (req.http.cookie) {
set req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");
if (req.http.cookie ~ "^ *$") {
remove req.http.cookie;
}
}
remove req.http.cookie;
remove req.http.etag;
}
sub vcl_fetch {
remove beresp.http.Set-Cookie;
remove beresp.http.ETag;
#do esi processing
set beresp.do_esi = true;
if (bereq.url ~ "[A-Za-z0-9_-]*.esi$") {
set beresp.ttl = 0s;
} else {
set beresp.ttl = 24h;
}
}
我有以下几个假设:
1) Varnish 每次从缓存中获取网页时,都会请求 "path/to/fragment.esi",然后重新组装缓存的网页,尤其是因为每个 .esi 片段的 beresp.ttl 都设置为 0 秒。
2) Varnish 不会把 ESI 片段和网页一起存储在它的缓存中。
1 个回答
0
我建议你可以尝试完全不使用缓存来处理所有以 *.esi 结尾的链接,也就是说,直接用 return(pass); 来处理,而不是设置 beresp.ttl = 0s;