Varnish ESI脚本可以获取打开的页面(原始页面)吗?

时间:2012-08-26 20:16:19

标签: php varnish esi

我有一个用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中,但事实并非如此。 :(

3 个答案:

答案 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") {
     ...
 }