【问题标题】:is it possible to change response on proxy level using varnish?是否可以使用清漆更改代理级别的响应?
【发布时间】:2021-05-17 05:28:17
【问题描述】:

例如我们有这样的设置:

user -> api gateway -> (specific endpoint) varnish -> backend service

如果后端返回响应 500 {"message":"error"} 我想修补此响应并返回 200 "[]"

是否可以使用 varnish 或其他代理来做这样的事情?

【问题讨论】:

    标签: nginx proxy reverse-proxy varnish


    【解决方案1】:

    绝对可以拦截后端错误,并将其转换为常规响应。

    一个非常简单的例子如下:

    sub vcl_backend_error {
        set beresp.http.Content-Type = "application/json";
        set beresp.status = 200;
        set beresp.body = "[]";
        return(deliver);
    }
    
    sub vcl_backend_response {
        if(beresp.status == 500) {
            return(error(200,"OK"));
        }
    }
    

    每当您的后端失败并返回 HTTP/503 错误时,我们将发送带有 [] 输出的 HTTP/200 响应。

    当后端回复时也会触发此后端错误输出模板,但出现HTTP/500 错误。

    在现实世界的场景中,我会在vcl_backend_error 中添加一些条件逻辑,以便仅在匹配特定条件时返回 JSON 输出模板。例如:匹配了某个 URL 模式。

    我会在vcl_backend_response 中提出相同的建议:也许您不想将所有HTTP/500 错误转换为常规HTTP/200 响应。也许您还想添加条件逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2015-06-26
      • 2016-11-16
      • 2018-04-09
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多