我正在努力解决 Varnish 问题。
我的问题是。我确实有一个主要的请求/响应,我想使用 Varnish 缓存它。在 html 结构内部有一个 ESI 标签。我想要很多。一个带有更长 ttls 的标签和其他带有 ttl=0s
的标签; (带有登录框的 ESI 内容)。
无论如何,我希望 Varnish 能够满足主要请求,但要向后端 ESI 内容询问一些信息,例如 header 。
当 ESI 内容回来时(因为我理解首先是父请求,然后是带有 ESI 的子请求),我想进行某种交流。
来自 https://www.varnish-software.com/static/book/VCL_functions.html
例如:
如果 ESI 子请求在响应中具有 header "X-ESI-Cookie"
,我想将其传递给主响应。
我能找到有关 ESI 的唯一方法是 reg.esi_level
。
if (req.esi_level > 0 ) {
set req.http.*;
}
基本上我想要实现的是:
我想要 Varnish 缓存我的整个页面,但对于 session 管理管道 ESI 内容,但为了保留 session ,我需要将一些 header 从 sub (ESI) 传递给父响应(但我相信这是显而易见的)。
我相信 Varnish 请求( parent 和 ESI)是分开处理的,这意味着我没有任何交流的机会。 Varnish 简单地用来自 ESI 响应的 html 替换标签。是这样吗?
我开始相信没有解决方案,但也许有人对这个问题有更好的解决方案:如何保留 session ?我找到了一些解决方案,但没有一个适合我的需求。 (我相信 Fake-Session,其中 ID 是由 Varnish 用一些 C 代码生成的,但没有锁定)。
我想以这种方式这样做,因为采用当前的 symfony2 应用程序对我来说会容易得多。
无论如何,我无法相信 symfony2 没想到这种功能。除了少数小部件(ESI 内容)之外,我的页面主要是静态的。
将 ESI 内容(请求、内容和响应)添加到对象变量会非常好:
obj.*
我不敢相信 Varnish 对象没有关于 ESI 内容的任何信息。
需要注意的是,我正在寻找 *.vcl 配置中的解决方案,但任何解决方案都适合我。
提前致谢。
最佳答案
可以使用 libvmod-var 将变量从主请求解析到 ESI 子请求,但这并没有真正记录,但它在当前版本的 libvmod-var 和 varnish 3.0.6 中工作正常。
关于symfony - 父请求和 ESI 子请求( Varnish 、 session 需求)之间的任何通信?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26054376/