未处理ESI的 Varnish 包括

标签 varnish varnish-vcl esi

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

我在虚拟机中运行 Varnish ,内容在主机上运行。

我有两个文件“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" />

IE。 ESI显示在标记中,但尚未处理。

我已经检查了Varnish日志,但是其中没有错误,也没有与ESI相关的信息。

有人可以在这里看到我做错了吗?让我知道是否需要更多信息..谢谢

最佳答案

如果您的 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";
}

然后在您的子 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;
      }
}

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

关于未处理ESI的 Varnish 包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092146/

相关文章:

linux - Mantis 错误跟踪器的 Varnish cookie 问题

ruby-on-rails - 关于这个 Varnish VCL 的几个问题

caching - 如何返回(传递)所有不在 acl 中的主机 - Varnish

c - 如何使用 inline-c 选择 Varnish 后端

laravel - Laravel 5.3 中的 ESI 标签

wordpress - Varnish 未启动语法错误

Varnish -如何在重新获取时为所有客户端提供过时的内容?

varnish4 与 varnish3 - 优雅行为

Varnish ESI 必须走不同的src路径吗?