0

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

我的清漆参数:

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"

我的默认.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,所以它只是渲染一个空的 body。

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

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生成

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

我已经尝试设置 Surrogate-Capability 并使用 Surrogate-Control 检查,对我来说它也不起作用。我没头绪了。。

4

1 回答 1

0

我不认为你可以。

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

如果您不这样做,Varnish 将不会解析 beresp 并将其按原样提供给客户端。

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

于 2017-04-06T18:42:09.383 回答