如何让Varnish停止缓存ESI片段

时间:2011-08-15 13:43:52

标签: python http caching varnish repoze.bfg

我在使用带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片段与网页一起存储在缓存存储区**

1 个答案:

答案 0 :(得分:0)

我首先尝试完全跳过* .esi网址的缓存,即return(pass);而不是设置beresp.ttl = 0s;