Php Varnish ESI脚本能否获取(源页面)上的页面?

Php Varnish ESI脚本能否获取(源页面)上的页面?,php,varnish,esi,Php,Varnish,Esi,我有一个用Varnish缓存的PHP页面:。 它有一些ESI脚本,如: 所有页面都有相似的页眉、页脚和侧边栏,因此我在执行VCL哈希时删除了name=name,这样所有页面都可以获得相同的缓存 问题是我想在esi.php脚本中知道哪个页面发出了esi请求。是categories.php?name=A还是categories.php?name=B 我该怎么做?我在任何地方都没有找到这个信息 我想它可能在HTTP REFERER中,但它不是: 在vcl_recv中尝试以下操作: if (req.es

我有一个用Varnish缓存的PHP页面:。 它有一些ESI脚本,如:

所有页面都有相似的页眉、页脚和侧边栏,因此我在执行VCL哈希时删除了name=name,这样所有页面都可以获得相同的缓存

问题是我想在esi.php脚本中知道哪个页面发出了esi请求。是categories.php?name=A还是categories.php?name=B

我该怎么做?我在任何地方都没有找到这个信息

我想它可能在HTTP REFERER中,但它不是:

在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上提出了类似的问题,但没有得到回答:

因此,如果要缓存包含所有查询字符串组合的esi标记的响应,似乎没有办法做到这一点

在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上提出了类似的问题,但没有得到回答:


因此,如果要缓存包含所有查询字符串组合的esi标记的响应,似乎没有办法做到这一点

同样的问题,同样的状态。为了解决这个问题,我将父URL作为参数添加到ESI URL中:

<esi:include src="/esi/content/?url=http://mysite.com/parent/page/" />

同样的问题,同样的状态。为了解决这个问题,我将父URL作为参数添加到ESI URL中:

<esi:include src="/esi/content/?url=http://mysite.com/parent/page/" />
从一开始,你可以做:

 if (0 < req.esi_level && req_top.url ~ "found/in/parent/url") {
     ...
 }
从一开始,你可以做:

 if (0 < req.esi_level && req_top.url ~ "found/in/parent/url") {
     ...
 }

如果粘贴vcl文件的内容会更好。找到解决此问题的方法了吗?如果粘贴vcl文件的内容会更好。找到解决此问题的方法了吗?这不起作用。Varnish将尝试新的ESI请求。在原始请求期间设置的所有请求头都将丢失。这不起作用。Varnish将尝试新的ESI请求。在原始请求期间设置的所有请求头都将丢失。