不加工ESI的清漆包括

时间:2012-04-10 15:56:03

标签: varnish varnish-vcl esi

我正在尝试设置Varnish来处理ESI包含在本地环境中。

我在虚拟机中运行清漆,内容正在主机上运行。

我有两个文件“index.html”和“test.html”。它们都存储在apache服务器docroot中名为“esi”的文件夹中。

的index.html

<h1>It Works!</h1>
<esi:include src="test.html" /> 

的test.html

<p>ESI HAS BEEN INCLUDED</p>

Varnish在端口8000上的虚拟机上运行。所以我在这里访问它:http://192.168.56.101:8000/esi/

在虚拟机上的/etc/varnish/default.vcl我已将followin配置添加到文件的底部:

sub vcl_fetch {
   set beresp.do_esi = true; /* Do ESI processing               */
   set beresp.ttl = 24 h;    /* Sets the TTL on the HTML above  */
}

认为它应该在所有请求上处理ESI(不要小心,如果它的不良做法只是试图让这个东西起作用:))

加载http://192.168.56.101:8000/esi/时的结果是:

<h1>It Works!</h1>
<esi:include src="test.html" />

即。 ESI显示在标记中,它没有被处理。

我已经检查了Varnish日志,但是没有任何错误,也没有与ESI有关。

谁能看到我在这里做错了什么?如果需要更多信息,请告诉我..谢谢

4 个答案:

答案 0 :(得分:1)

如果您的esi包含src是“test.html”,则varnish将该请求发送到您的默认后端,即127.0.0.1。我相信您需要为远程服务器配置第二个后端。像这样:

backend default {
    .host = "127.0.0.1";
    .port = "8000";
}

backend hostmachine {
    .host = "50.18.104.129"; # Enter your IP address here
    .port = "80";
}

然后在您的sub vcl_recv中,您需要将URL中包含/ esi /的流量重定向到远程服务器。

sub vcl_recv {
      if (req.url ~ "^/esi/") {
            set req.backend = hostmachine;
            set req.http.host = "www.correctdomainname.com";
      } else {
            set req.backend = default;
      }
}

我现在正在做同样的事情,所以试一试,让我知道它是否适合你。

答案 1 :(得分:1)

Varnish只实现了一小部分ESI。截至2.1三个ESI声明:

    esi:include
    esi:remove
    <!--esi ...-->

基于变量和Cookie的内容替换未实现,但在路线图中。 Varnish不会在HTML注释中处理ESI指令。 要使ESI工作,您需要在VCL中激活ESI处理,如下所示:

sub vcl_fetch {
if (req.url == "/index.html") {
   set beresp.do_esi = true; /* Do ESI processing               */
   set beresp.ttl = 24 h;    /* Sets the TTL on the HTML above  */
} elseif (req.url == "/test.html") {
   set beresp.ttl = 1m;      /* Sets a one minute TTL on        */
                             /*  the included object            */
}

}

答案 2 :(得分:1)

对ESI工作(清漆3.x), 第一个字符必须是&#34;&lt;&#34;所以只需添加HTML结构

这是我的测试:

<强>的index.php

<html>
<head>
    <title></title>
</head>
<body>
<?php

    $now = new \DateTime('now');
    echo "hello world from index.php ".$now->format('Y-m-d H:i:s');
?>

<br/>

<esi:include src="/date.php"/>

<br/>

<esi:remove>
    ESI NOT AVAILABLE
</esi:remove>

<br/>

<!--esi
ESI AVAILABLE !!

-->
</body>
</html>

<强> date.php

<?php
$now = new \DateTime('now');
echo "hello world from date.php ".$now->format('Y-m-d H:i:s');

输出

hello world from index.php 2014-08-21 10:45:29
hello world from date.php 2014-08-21 10:46:35

答案 3 :(得分:0)

确保您的配置已被清漆读取。如果您在Docker容器中运行清漆,则可能必须重建它。

您可以将您的配置更改为荒谬的东西,然后查看它是否可以捕获它。例如,将后端更改为w3.org。

如果仍然可以得到相同的结果,则说明您的配置未使用。