如何让Varnish停止缓存ESI片段

2 投票
1 回答
2009 浏览
提问于 2025-04-16 23:37

我在用 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;

撰写回答