4

我正在尝试制作清漆。

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

提前致谢。

4

1 回答 1

0

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

于 2014-11-20T12:51:36.843 回答