我想在 Varnish 中使用 ESI 来组合来自不同方面的内容。每一面都是一个带有小前端片段的小型微服务。ESI 应该使用不同的片段构建页面。
我将使用 Varnish 4.0.5。只要我将它用于我身边的内容,它就可以正常工作。
<html>
<body>
<esi:include src="/hello"/> <!-- works -->
<esi:include src="http://www.example.org/index.html"/> <!-- doesn't works -->
</body>
</html>
这是我的vcl
vcl 4.0;
backend default {
.host = "localhost";
.port = "8080";
}
sub vcl_recv {
# Only a single backend
set req.backend_hint= default;
# Setting http headers for backend
set req.http.X-Forwarded-For = client.ip;
# Unset headers that might cause us to cache duplicate infos
unset req.http.Accept-Language;
unset req.http.User-Agent;
# drop cookies and params from static assets
if (req.url ~ "\.(gif|jpg|jpeg|swf|ttf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
unset req.http.cookie;
set req.url = regsub(req.url, "\?.*$", "");
}
# drop tracking params
if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
set req.url = regsub(req.url, "\?.*$", "");
}
}
sub vcl_backend_response {
set beresp.do_esi = true;
}
我将在浏览器中得到以下结果
hello
Cannot GET /index.html
当我也在 VCL 中定义外部主机时
backend otherbackend {
.host = "www.example.org";
.port = "80";
}
和
sub vcl_recv {
# Only a single backend
set req.backend_hint= default;
if (req.http.host == "www.example.org") {
set req.backend_hint = otherbackend;
}
我将从外部站点获取一些内容(不会提供静态资源,因此会导致浏览器出错)
问题 - 有没有一种方法可以在不将每个外部站点都定义为后端的情况下从外部站点获取内容?