0

对于主要端点需要授权的端点,我使用 varnish 和 Edge-side 包含,但 ESI 通常不会......但有时它们会这样做。当我希望所有 ESI 请求保留授权标头时,我现在通过添加一个我调用Keep-Authorization到主请求的标头来处理它。然后我有

vcl_recv {
  ...
  if (req.esi_level > 0 && !req.http.Keep-Authorization) {
    unset req.http.authorization;
  ...
  }
}

这工作正常,但很不优雅——它要求请求者知道是否添加该 Keep-Authorization 标头。虽然 API 目前仅供我们使用,但可能会发生变化。

事实上,0 级响应知道它的 ESI 孩子是否需要授权,并且应该能够设置一个标头来表明这一点。如果我可以在清漆生命周期的适当部分阅读它,我可以在 ESI 基于我从 0 级响应得到的内容解决之前适当地删除(或不)授权标头。

这似乎是我必须做的事情vcl_backend_response,但我不太确定。或者,如果vcl_recv有类似req_top顶级响应的东西(在解决 ESI 时应该可用),也可以解决问题。

简而言之,我希望源能够确定是否保留授权标头以在其响应中解析 ESI。这是可行的吗?

4

1 回答 1

1

没有beresp_top不幸的事。vcl_recv而且由于客户端逻辑和后端逻辑在 VCL 中分离,因此在使用本机 VCL时确实可以获取这些信息。

一个可能的解决方案是利用vmod_var. 这是一个开源 Varnish 模块,它是https://github.com/varnish/varnish-modules的一部分。

目前没有它的包,所以你必须从源代码编译它。根据 Varnish 的版本,您需要下载正确的分支。

var.global_set()函数允许您在 中设置一个全局变量vcl_backend_response,您可以vcl_recv使用var.global_get()

然后,您可以使用以下 VCL 代码有条件地剥离Authorization标题:

vcl 4.1;

import var;

sub vcl_recv {
    if(var.global_get(req.url + "-remove-auth") == "true" || var.global_get(req_top.url + "-remove-auth") == "true") {
        unset req.http.Authorization;
    }
}

sub vcl_backend_response {
    if(beresp.http.X-Remove-Auth) {
        var.global_set(bereq.url + "-remove-auth", "true");
    }
}
于 2021-11-02T15:26:27.853 回答