父请求和ESI子请求之间的任何通信(清漆,会话需求)?

时间:2014-09-26 07:35:56

标签: symfony session caching varnish esi

我正在尝试制作清漆。

我的问题是。我有一个主要请求/响应,我想使用清漆缓存。在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配置中寻找解决方案,但任何解决方案都适用于我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

可以使用libvmod-var将主请求中的变量解析为ESI子请求,但是这并没有真正记录,但它在当前版本的libvmod-var和varnish 3.0.6中工作正常。