【问题标题】:Why is Varnish caching ESI fragments (when I tell it not to)?为什么 Varnish 缓存 ESI 片段(当我告诉它不要时)?
【发布时间】:2014-05-01 02:58:26
【问题描述】:

我遇到了 Varnish ESI 的一个特殊问题。

我网站上的每个页面都有一个 ESI 片段,用于显示(已登录)用户的帐户信息。

看起来 Varnish 正在返回用户会话 ESI 片段的缓存结果,除非浏览器发送一个 Cache-Control: no-cache / Pragma: no-cache (force refresh) ,这是当它从服务器。

我的 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;
}

基本上,这是浏览器端的行为:

Cache-Control: max-age=0 => Varnish 返回缓存的 ESI 片段

Cache-Control: no-cache / Pragma: no-cache => Varnish 从服务器获取 ESI 片段

我似乎无法弄清楚,我感觉我错过了一些相当明显的配置。

【问题讨论】:

  • 万一有人看到这个,就知道问题所在了。原来我的后端设置了 Etag,Varnish 用它来决定是否提供新的 ESI 片段。我只是将这一行添加到 vcl_deliver ,现在它就像一个魅力! sub vcl_deliver { ... unset resp.http.Etag; ... }

标签: caching varnish varnish-vcl esi


【解决方案1】:

万一有人看到了,就解决问题了。

原来后端设置了 Etag,Varnish 使用该 Etag 来决定是否从服务器提供新的 ESI 片段(浏览器将在 If-None-Match 请求标头中发送此 Etag,除非它是强制刷新)。

我只是将这一行添加到 vcl_deliver,现在它就像一个魅力!

subl vcl_deliver {
  ...
  unset resp.http.Etag;
  ...
}

【讨论】:

  • 谢谢。这解决了一个非常烦人的问题,而且在 Varnish 中,esi 所需的设置似乎没有充分记录
【解决方案2】:

我不得不重击 esi 模板的 If-Modified-Since 和 If-None-Since 请求标头,以防止提供 esi 组装的输出。

sub vcl_recv {
...
      unset req.http.If-Modified-Since;
      unset req.http.If-None-Match;
...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2022-01-23
    相关资源
    最近更新 更多