APISIX的response_rewrite插件使用说明

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可以新增,可以修改,可以删除,有兴趣的自行看文档吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值