清漆缓存中的无限重定向循环

时间:2012-06-06 13:58:18

标签: varnish varnish-vcl

我们最近把Varnish放在我们的Drupal面前,因为服务器负载很重,我们非常高兴。

唯一的问题是我们有时在缓存数据中有一个无限重定向循环。我们通过HTTP监控找到了这个。我们每分钟检查一页。缓存中的页面有时包含完整的首页,但有一个Location标头集,可以将用户再次发送到首页。

我们不太确定是什么原因造成这种情况,但也不清楚如何追踪这一点。当然,解决这个问题的最佳方法是在drupal方面,但我们无法确切地知道为什么会这样。

当发生这种情况时,有没有办法记录案例?或者是否可以在清漆中检测到这种情况并将当前缓存内容标记为无效?

当然,我们不希望总是将有意重定向传递给原始服务器,而是会导致无限循环。

我希望听到一些想法,我们如何进一步追踪这一点。许多人提前感谢各种提示。

2 个答案:

答案 0 :(得分:2)

我找到了解决方法:

sub vcl_fetch {
  // Fix a strange problem: HTTP 301 redirects to the same page sometimes go in$
  if (beresp.http.Location == "http://" + req.http.host + req.url) {
    if (req.restarts > 2) {
      unset beresp.http.Location;
      #set beresp.http.X-Restarts = req.restarts;
    } else {
      return (restart);
    }
  }
}

我给后端第二个(和thirhd)机会返回一个合适的页面。如果失败,则会删除Location标头。这是有效的,因为正确的页面只有一个额外的无效Location头。

答案 1 :(得分:0)

@philip接受的答案已针对Varnish 4更新:

sub vcl_backend_response {

#Fix a strange problem: HTTP 301 redirects to the same page sometimes go in$
if (beresp.http.Location == "http://" + bereq.http.host + bereq.url) {
    if (bereq.retries > 2) {
      unset beresp.http.Location;
      #set beresp.http.X-Restarts = bereq.retries;
    } else {
      return (retry);
    }
}

}