我在使用带Varnish 3.0的ESI和repoze.bfg项目成功时遇到问题。我有一个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片段与网页一起存储在缓存存储区**
答案 0 :(得分:0)
我首先尝试完全跳过* .esi网址的缓存,即return(pass);而不是设置beresp.ttl = 0s;