exit-transformer
exit-transformer 插件可自定义通过 APISIX response-exit 路径产生的响应,包括插件拒绝和路由不存在响应。它不会转换上游服务返回的普通响应。
转换逻辑在插件中使用 Lua 函数定义,遵循以下语法:
return (function(code, body, header) if {{ condition }} then return {{ modified_resp }} end return code, body, header end)(...)
示例
以下示例演示了如何在不同场景下使用 exit-transformer。
启用 exit-transformer 插件
对于 APISIX 部署,在配置使用 exit-transformer 的全局规则或路由前,请先在网关静态配置中加载该插件。当已安装的网关版本启用此插件时,API7 Gateway 用户可通过 Dashboard 或 Admin API 配置它。
- 宿主机或 Docker
- Kubernetes (Helm)
对于 APISIX 宿主机或 Docker 部署,请保留 config.yaml 中现有插件列表,并加入 exit-transformer:
config.yaml
plugins:
# 保留现有插件列表。
- exit-transformer
重新加载网关以使更改生效。
对于 APISIX Helm Chart,apisix.plugins 会替换已加载插件列表。请从当前网关使用的完整插件列表开始,加入 exit-transformer,并保留列表中的其他插件:
values.yaml
apisix:
plugins:
# 保留网关使用的完整插件列表。
- exit-transformer
使用 APISIX Helm Chart 应用 values 文件:
helm upgrade <release-name> <chart-name> -n <namespace> -f values.yaml
修改 404 路由未找到响应
以下示例演示了当路由不存在时,如何使用该插件更新 404 Not Found 响应代码和头。在这种情况下,插件需要配置为全局规则插件。
创建一个启用 exit-transformer 插件的全局规则,其中函数将响应状态码更新为 405,如果原始状态码为 404,则添加自定义 X-Custom-Header 头:
- Admin API
- ADC
- Ingress Controller
curl -i "http://127.0.0.1:9180/apisix/admin/global_rules" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "transform-404-not-found",
"plugins": {
"exit-transformer": {
"functions": ["return (function(code, body, header) header = header or {} if code == 404 then header[\"X-Custom-Header\"] = \"Modified\" return 405, body, header end return code, body, header end)(...)"]
}
}
}'
adc.yaml
global_rules:
- id: transform-404-not-found
plugins:
exit-transformer:
functions:
- "return (function(code, body, header) header = header or {} if code == 404 then header[\"X-Custom-Header\"] = \"Modified\" return 405, body, header end return code, body, header end)(...)"
将配置同步到网关:
adc sync -f adc.yaml
- Gateway API
- APISIX CRD
gatewayproxy.yaml
apiVersion: apisix.apache.org/v1alpha1
kind: GatewayProxy
metadata:
namespace: aic
name: apisix-config
spec:
provider:
type: ControlPlane
controlPlane:
# 在此添加控制面连接配置
# ....
plugins:
- name: exit-transformer
enabled: true
config:
functions:
- "return (function(code, body, header) header = header or {} if code == 404 then header[\"X-Custom-Header\"] = \"Modified\" return 405, body, header end return code, body, header end)(...)"
应用配置:
kubectl apply -f gatewayproxy.yaml
exit-transformer-ic.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixGlobalRule
metadata:
namespace: aic
name: transform-404-not-found
spec:
ingressClassName: apisix
plugins:
- name: exit-transformer
enable: true
config:
functions:
- "return (function(code, body, header) header = header or {} if code == 404 then header[\"X-Custom-Header\"] = \"Modified\" return 405, body, header end return code, body, header end)(...)"
应用配置:
kubectl apply -f exit-transformer-ic.yaml
发送请求到一个不存在的路由:
curl -i "http://127.0.0.1:9080/non-existent"
你应该收到 HTTP/1.1 405 Not Allowed 响应,并看到 X-Custom-Header: Modified 头。