我有一个用Varnish缓存的PHP页面:http://categories.php?name=NAME。 它有一些ESI脚本,如:< esi:include src =“/ esi.php”/>
所有页面都有类似的页眉,页脚,侧栏,所以我在执行VCL哈希时删除了name = NAME,这样所有页面都可以获得相同的缓存。
问题是我想在esi.php脚本中知道发出ESI请求的页面。是categories.php?name = A还是categories.php?name = B?
我该怎么做?我没有在任何地方找到这些信息。
我当时认为它可能在HTTP REFERER中,但事实并非如此。 :(
答案 0 :(得分:2)
同样的问题,相同的状态。为了解决这个问题,我将父URL作为参数添加到ESI URL:
<esi:include src="/esi/content/?url=http://mysite.com/parent/page/" />
答案 1 :(得分:1)
在vcl_recv中尝试:
if (req.esi_level == 0) {
set req.http.X-Esi-Parent = req.url;
}
这将导致所有与此主要请求相关的esi请求在名为“X-Esi-Parent”的请求标头中发送原始URL,该标头可以在后端读取。
<强>更新强>
评论中的Aleksandr正确指出这不起作用,因为vcl_recv中设置的标头不会出现在后续的esi请求中 - 只有来自客户端的标头。有些人在listserv上提出了类似的问题而未得到回答:
https://www.varnish-cache.org/lists/pipermail/varnish-misc/2012-February/021706.html
http://marc.info/?l=varnish-dev&m=135273366517518&w=2
因此,如果要在所有查询字符串组合中缓存包含esi标记的响应,似乎无法执行此操作。
答案 2 :(得分:1)
从Varnish 4.1开始,您可以:
if (0 < req.esi_level && req_top.url ~ "found/in/parent/url") {
...
}