2012-08-26 53 views
2

我有一个PHP页面,可以用Varnish缓存:http://categories.php?name=NAME。 它有一些ESI脚本,如:< ESI:包括SRC =“/ esi.php” />可以清漆ESI脚本获取(源页)上的页面?

的所有页面都具有相似的页眉,页脚,侧边栏,所以我删除名称= NAME做VCL哈希时,因此所有页面可以获得相同的缓存。

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

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

我在想它可能在HTTP REFERER中,但事实并非如此。 :(

+0

会更好,如果你粘贴'vcl'内容文件。 –

+0

你有没有找到这个问题的解决方案? –

回答

1

试试这个在vcl_recv:

if (req.esi_level == 0) { 
    set req.http.X-Esi-Parent = req.url; 
} 

这将导致与此相关的主请求被称为“X-ESI-父”请求头中发送原始URL的所有ESI请求可读取。在后端

更新

亚历山大在评论中正确地指出,这是不行的,因为在vcl_recv设置头不存在后续ESI要求 - 只有头来回客户。有几个人问的群发类似的问题没有被回答:

https://www.varnish-cache.org/lists/pipermail/varnish-misc/2012-February/021706.html

http://marc.info/?l=varnish-dev&m=135273366517518&w=2

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

+0

这不起作用。清漆将尝试ESI的新要求。在原始请求期间设置的所有请求标头都将丢失。 –

+0

@AleksandarJanković你说得对,我会更新我的答案。 –

2

同样的问题,相同的状态。为了解决这个问题,我添加父URL作为参数传递给ESI网址:

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

Varnish 4.1开始,你可以这样做:

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