APISIX是一个非常强大的网关,提供了很多的插件。
这里介绍下response_rewrite插件的用法。
看名字就能知道,这个插件的作用是对返回的response进行重写。
官网说明:response-rewrite | Apache APISIX® -- Cloud-Native API Gateway
他支持很多参数,核心就下面4个。
body,header,vars,filters
使用的时候需要分两种情况。
1. 根据请求头参数、http状态参数进行匹配,然后重写body。
2. 根据返回body内容,进行重写。
第一种情况示例
根据http状态码或者header参数匹配重写。
{
"_meta": {
"disable": false
},
"body": "{\"code\":\"error\",\"message\":\"AccessDenied\"}",
"disable": false,
"headers": {
"set": {
"content-type": "application/json"
}
},
"vars": [
[
"status",
"==",
403
]
]
}
上面示例是根据返回状态码进行匹配,然后修改了请求头的content-type类型为json,然后重写了body返回内容。
其实是为了快速解决一个西南要求的安全内容,要求隐藏一个云平台对象存储返回403时,会携带存储桶等信息。其实是minio等对象存储的默认格式,由于无法改,所以只能通过网关转发,然后在转发响应的时候重写移除了相关内容。
第二种情况
要根据响应体body内容匹配,然后进行替换。
vars参数不支持body内容比对,需要使用filters参数。
{
"_meta": {
"disable": false
},
"disable": false,
"filters": [
{
"regex": "短信验证码不正确",
"replace": "用户名或密码错误",
"scope": "global"
},
{
"regex": "手机号码不存在或存在多条记录,请联系管理员",
"replace": "用户名或密码错误",
"scope": "global"
}
]
}
filter默认就是匹配body。
regex是原字符串,replace是替换后字符串,scope是使用范围。
上面俩是信安要求不能精确提示错误信息,避免黑客猜手机号和账号名。由于需要快速修复,所以也用了apisix进行拦截。
注意事项
网关的负载是比较高的,原则上不应该在网关上进行这类处理。即便必须要使用,也要尽量细化一下。
例如,response_rewrite组件,其实可以全局应用,也可以单独应用到指定路由上。
这里我为了降低负载,实际上只对单个路由使用了这个组件重写,所以不会消耗太多性能。
全局应用
直接在插件这里启用,就是全局应用,所有请求过来都会匹配,会比较影响性能。
路由使用
在单个路由里面,使用完整路径匹配
在插件配置中,启用组件。
这样就只有这个路由会生效。
其实还有很多灵活的用法,比如header可以新增,可以修改,可以删除,有兴趣的自行看文档吧。