2

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

4

3 回答 3

2

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

<esi:include src="/esi/content/?url=http://mysite.com/parent/page/" />
于 2013-09-24T08:01:39.363 回答
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 标签的响应,似乎没有办法做到这一点。

于 2013-07-18T01:07:07.013 回答
1

Varnish 4.1开始,您可以:

 if (0 < req.esi_level && req_top.url ~ "found/in/parent/url") {
     ...
 }
于 2016-12-11T19:37:23.390 回答