我有一个以 Varnish 服务器为前端的应用程序。部分页面使用 ESI 包含呈现。
我的问题是上游响应包含一个加密的会话 cookie,其中包含一个 CSRF 令牌(根本没有服务器端会话存储)。
对于初始请求(请求中没有 cookie),ESI 请求将不包含由上游服务器的第一个响应设置的 cookie。
我已经尝试req.http.Cookie
在vcl_deliver
钩子中设置,因为它是请求流中我发现两者都可以读写的唯一req
位置res
。但是,使用 varnishlog 查看请求会发现 ESI 请求不受影响并且不包含 cookie。
我已尽我所能浏览文档,但找不到任何远程有用的东西。
是否有可能实现我想要的,即更新req
以使 ESI 请求包含初始上游响应返回的 cookie?
我们需要明确区分包含标头的请求和包含
Cookie
标头的响应Set-Cookie
。假设 CSRF 令牌是通过父响应的标头设置的,您可能希望通过ESI 子请求中的请求标头
Set-Cookie
访问该值。Cookie
假设 Cookie 标头已经包含 CSRF 令牌
该
req_top.http.Cookie
变量可以访问父请求的 cookie,但在解析 ESI 占位符的位置req_top
无法访问。vcl_backend_response
您可以使用以下 VCL 片段绕过此限制:
这将启用在through
X-Parent-Cookie
中可用的标头。vcl_backend_response
bereq.http.X-Parent-Cookie
假设 Cookie 标头尚未包含 CSRF 令牌
假设它
req_top.http.Cookie
还不包含 CSRF 令牌的值是现实的,因为在处理 ESI 子请求时,Cookie
客户端尚未设置标头。我能想到的唯一解决方案是将父
Set-Cookie
值存储在变量中。Varnish 本身不支持变量,需要安装官方的https://github.com/varnish/varnish-modules。您必须从源代码编译它。
有关API 和代码示例,请参阅https://github.com/varnish/varnish-modules/blob/master/src/vmod_var.vcc 。
vmod_var