我有一个用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中,但事实并非如此(
同样的问题,同样的状态。为了解决这个问题,我添加了父URL作为ESI URL的参数:
<esi:include src="/esi/content/?url=http://mysite.com/parent/page/" />
在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标记的响应,似乎没有办法做到这一点。
从Varnish 4.1开始,您可以执行:
if (0 < req.esi_level && req_top.url ~ "found/in/parent/url") {
...
}