Varnish ESI仅包含从后端获取父页面时的工作

时间:2012-07-18 23:47:38

标签: varnish esi

我正在运行Varnish 3.0.2,Apache2,Pressflow。我试图让ESI升级并且第一次工作,它确实有效,但只是第一次请求父页面。之后,它只是从缓存中提取父页面和替换的内容。我唯一能想到的是包含的内容被永久缓存,即使我告诉它根本不缓存包含的文件,这里是存储包含文件的对象...

11 ObjProtocol  c HTTP/1.1
11 ObjResponse  c OK
11 ObjHeader    c Date: Wed, 18 Jul 2012 23:25:56 GMT
11 ObjHeader    c X-Powered-By: PHP/5.3.3-1ubuntu9.10
11 ObjHeader    c Last-Modified: Wed, 18 Jul 2012 23:25:56 +0000
11 ObjHeader    c Expires: Sun, 11 Mar 1984 12:00:00 GMT
11 ObjHeader    c Vary: Cookie,Accept-Encoding
11 ObjHeader    c ETag: "1342653956"
11 ObjHeader    c Content-Encoding: gzip
11 ObjHeader    c Content-Length: 656
11 ObjHeader    c Content-Type: text/html
11 ObjHeader    c Server: Apache/2.2.11
11 ObjHeader    c Cache-Control: no-store

我花了整整一天时间,搜索,阅读我能找到的每篇文章,在VCL和HTTP标题中尝试了一大堆配置调整。我看不出任何我做错的事。

这是我的VCL的一个片段,试图强制它不存储在缓存中

sub vcl_fetch {
  set beresp.do_esi = true;
  if (req.url ~ "^/esi_") {
    set beresp.http.Cache-Control = "no-store";
    set beresp.ttl = 0s;
  }
}

我想补充一点,我在varnishlog中没有看到任何错误。我试过在include src中只使用路径和主机+路径,但没有区别。它根本不会向后端询问新内容。如果您正在查看第二个和后续请求的日志,您将不会意识到它是ESI页面。

1 个答案:

答案 0 :(得分:0)

在sub vcl_recv {}中提供了一些内容,告诉varnish不要在缓存中查找请求,并从后端服务器定义一个额外的http响应元素,该响应元素由vcl中的条件处理。例如“pragma:no-cache”..

您可以使用〜“^ / esi_”..

在vcl_recv中扩展此条件
sub vcl_recv(
  # ...
  # the rest goes here ..
  # ...
  if ((req.url ~ "^/esi_") && (req.http.pragma ~ "no-cache")) {
    return (pass);
  }
 # ...
}