清漆4 ESI:bereq.url不读取ESI src标签

时间:2017-04-06 08:10:35

标签: varnish varnish-vcl esi varnish-4

我使用清漆4,php-fpm 7,nginx,centos 7

我的varnish.params:

DAEMON_OPTS="-a :80 -T 127.0.0.1:6082 
             -f /etc/varnish/default.vcl 
             -S /etc/varnish/secret 
             -s malloc,1g 
             -p feature=+esi_disable_xml_check,+esi_ignore_other_elements 
             -p cli_buffer=16384 
             -p vcc_allow_inline_c=on"

我的default.vcl:

if (bereq.url ~ "^.*(\/**esi**\/)+.*$") {
   set beresp.do_esi = true;
   set beresp.ttl = 0s;
} else { 
   set beresp.ttl = 3600s;
}

我的问题是当我使用通过访问来触发的vcl代码时说出来:http://localhost/lab/varnish

呈现:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
    <esi:include src="http://localhost/lab/esi/body"/>
</body>
</html>

Varnish没有读取ESI标签内的url src,所以它只是渲染一个空体。

但是当我使用这段代码时:

if (bereq.url ~ "^.*(\/**lab**\/)+.*$") {
   set beresp.do_esi = true;
   set beresp.ttl = 0s;
} else { 
   set beresp.ttl = 3600s;
}

Varnish成功呈现ESI标签内的内容,该标签由以下产生: http://localhost/lab/esi/body

  

如何根据识别ESI“src”标签中的内容使Varnish触发ESI片段渲染?

我已经尝试设置Surrogate-Capability并使用Surrogate-Control进行检查,对我来说,它也不起作用。我的线索已经用完了......

1 个答案:

答案 0 :(得分:0)

我认为你不能。

如果将beresp.do_esi设置为true,Varnish将解析后端响应并将每个esi:include标记替换为其源内容。

如果你没有Varnish不解析beresp并按原样提供给客户。

顺便说一下,为什么要部分替换esi标签?