Varnish ESI场景下条件移除Authorization header的实现方案咨询
这个需求完全可以实现,核心逻辑是将源站返回的授权保留规则存储在顶层主请求的上下文内,ESI子请求执行时读取该规则即可。
实现步骤
- 源站侧调整:主请求的源站返回响应时,如果当前响应包含的ESI子资源需要保留Authorization头,就添加自定义响应头
X-ESI-Keep-Authorization: 1,不需要保留则不返回该头。 - VCL配置调整
首先在vcl_backend_response阶段读取源站返回的规则标识,存入主请求上下文:
然后修改vcl_backend_response { # 仅处理顶层主请求的后端响应 if (bereq.esi_level == 0 && beresp.http.X-ESI-Keep-Authorization) { # 将规则标识存入主请求的自定义头,供后续子请求读取 set bereq.http.X-ESI-Keep-Authorization = beresp.http.X-ESI-Keep-Authorization; # 可选:从响应中移除该内部标识头,避免暴露给客户端 unset beresp.http.X-ESI-Keep-Authorization; } # 保留你原有开启ESI的逻辑即可,示例如下: if (beresp.http.Surrogate-Control ~ "ESI/1.0") { set beresp.do_esi = true; } # 其余原有逻辑保持不变 ... }vcl_recv阶段的子请求判断逻辑,读取顶层主请求的规则:vcl_recv { # 仅处理ESI子请求 if (req.esi_level > 0 && !req_top.http.X-ESI-Keep-Authorization) { unset req.http.Authorization; } # 其余原有逻辑保持不变 ... }
说明
- 上述配置用到的
req_top是Varnish内置的对象,永远指向最顶层的主请求,即使存在多层ESI嵌套也能正确读取到源站返回的规则。 - 整个流程完全由源站控制授权头是否保留,不需要客户端做任何适配,适合对外开放的API场景。
- 如果需要支持每层ESI资源单独控制授权规则,把逻辑中的
req_top替换为req_parent即可,req_parent指向当前子请求的上一级父请求。
内容的提问来源于stack exchange,提问作者Karptonite
相关产品推荐
相关产品推荐

