我正在尝试制作清漆。
我的问题是。我有一个主要请求/响应,我想使用清漆缓存。在html结构里面有一个ESI标签。我想要很多。一个标签的ttls较长,另一个标签ttl=0s
; (ESI内容与登录框)。
无论如何,我希望varnish能够点击主要请求,但是要向后端ESI内容询问标题等信息。 当ESI内容回来时(因为我首先理解父请求,然后是ESI的子请求),我想要进行某种沟通。
请记住,对beresp所做的更改会在之后存储在obj中。和 resp。*变量是即将返回的副本 - 可能是obj。换句话说,改变为beresp会影响 future obj。*和resp。*变量。类似的语义适用于req。* 和bereq。。 bereq。是从后台创建的“后端请求” 原始要求。它可能略有不同 - 清漆可以转换HEAD 例如,请求GET。
来自https://www.varnish-software.com/static/book/VCL_functions.html
例如:
如果ESI子请求在响应时有标题"X-ESI-Cookie"
,我想将其传递给主响应。
我能找到ESI的唯一方法是reg.esi_level
。
if (req.esi_level > 0 ) {
set req.http.*;
}
基本上我想要实现的是:
我希望varnish缓存整个页面,但是对于会话管理管道ESI内容,但为了保留会话我需要将一些头文件从子(ESI)传递给父响应(但我相信这很明显)。
我认为清漆请求(父母和ESI)是分开处理的,这意味着我没有任何机会进行沟通。 Varnish只需用ESI响应中的html替换tag。是这样吗?
我开始相信没有解决方案,但也许有人有更好的解决方案来解决这个问题:如何保存会话?我找到了一些解决方案,但没有人符合我的需求。 (我相信Fake-Session,其中ID由Varnish生成,带有一些C代码,但没有锁定。)
我想以这种方式做到这一点,因为我采用当前的symfony2应用程序要容易得多。 无论如何,我无法相信symfony2没想到这种功能。除了少数小部件(ESI内容)之外,我的页面主要是静态的。
尽管将ESI内容(请求,内容和响应)提供给对象变量,这将是非常好的:
obj.*
我无法相信varnish对象没有关于ESI内容的任何信息。
重要的是要注意我在* .vcl配置中寻找解决方案,但任何解决方案都适用于我。
提前致谢。
答案 0 :(得分:0)
可以使用libvmod-var将主请求中的变量解析为ESI子请求,但是这并没有真正记录,但它在当前版本的libvmod-var和varnish 3.0.6中工作正常。