Varnish ESI脚本能否获取上的页面(原始页面)


Can Varnish ESI script get the page that was on (origin page)?

我有一个用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") {
     ...
 }