我正在尝试设置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有关。
谁能看到我在这里做错了什么?如果需要更多信息,请告诉我..谢谢
答案 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。
如果仍然可以得到相同的结果,则说明您的配置未使用。