我正在尝试制作清漆。
我的问题是。我确实有一个主要的请求/响应,我想使用清漆进行缓存。在 html 结构内部有一个 ESI 标签。我想拥有很多。一个带有较长 ttls 的标签,另一个带有ttl=0s
; (带有登录框的 ESI 内容)。
无论如何,我希望清漆达到主要请求,但向后端 ESI 内容询问一些信息,如标头。当 ESI 内容返回时(因为我理解首先是父请求,然后是带有 ESI 的子请求),我想要进行某种沟通。
请记住,对 beresp 所做的更改之后会存储在 obj 中。而 resp.* 变量是即将返回的内容的副本——可能是 obj 的副本。换句话说,对 beresp 的更改将影响未来的 obj.* 和 resp.* 变量。类似的语义适用于 req.* 和 bereq。. 贝雷克 是从原始请求创建的“后端请求”。它可能略有不同——例如 Varnish 可以将 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.*;
}
基本上我想要实现的是:
我希望清漆缓存我的整个页面,但对于会话管理管道 ESI 内容,但为了保留会话,我需要将一些标头从子(ESI)传递给父响应(但我相信这很明显)。
我相信清漆请求(父母和 ESI 的)是分开处理的,这意味着我没有任何交流的机会。Varnish 只需将标签替换为来自 ESI 响应的 html。是这样吗?
我开始相信没有解决方案,但也许有人对这个问题有更好的解决方案:如何保留会话?我找到了一些解决方案,但没有一个适合我的需求。(我相信使用 Fake-Session,whre ID 是由 Varnish 使用一些 C 代码生成的,但没有锁定)。
我想这样做是因为采用当前的 symfony2 应用程序对我来说会容易得多。无论如何,我不敢相信 symfony2 没想到会有这种功能。除了一些小部件(ESI 内容)之外,我的页面主要是静态的。
将 ESI 内容(请求、内容和响应)添加到对象变量会非常好:
obj.*
我不敢相信清漆对象没有任何关于 ESI 内容的信息。
重要的是要注意我正在寻找 *.vcl 配置中的解决方案,但任何解决方案都对我有用。
提前致谢。