【问题标题】: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 响应。也许您还想添加条件逻辑。