news 2026/9/16 16:34:23

Higress custom-response 插件完全指南:自定义 HTTP 应答状态码、响应头与 Body

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Higress custom-response 插件完全指南:自定义 HTTP 应答状态码、响应头与 Body

Higress custom-response 插件完全指南:自定义 HTTP 应答状态码、响应头与 Body

【免费下载链接】higress🤖 AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress

本篇技术指南以 Higress 开源仓库中 custom-response 示例插件 的官方文档为核心,系统讲解该插件如何实现自定义 HTTP 应答(状态码、响应头、Body),覆盖新旧两种配置格式、精确与模糊状态码匹配规则、Mock 响应以及触发限流时自定义响应等实战场景,并深入源码与测试验证底层实现。读完本文,你将掌握在 Higress 网关上按需"篡改"上游应答、实现 Mock 与限流兜底页面的完整方案。

功能说明

custom-response插件允许网关为请求返回完全自定义的 HTTP 响应,可配置的部分包括:

  • 自定义 HTTP 应答状态码(status_code
  • 自定义 HTTP 应答头(headers
  • 自定义 HTTP 应答 Body(body

典型应用场景有两种:

  1. Mock 响应:不访问真实上游,直接由网关返回模拟数据;
  2. 按状态码定制应答:判断上游(或网关内部限流策略)返回的特定状态码后,替换为自定义响应,例如触发网关限流策略时返回 302 重定向到降级页面。

运行属性

属性
插件执行阶段认证阶段(Authentication Phase)
插件执行优先级910

插件在认证阶段以 910 的优先级参与请求处理,因此可以在限流等前置插件产生429之后,再对本已发出的响应进行改写。

配置字段说明

新版本:支持多种返回(rules 数组)

新版本配置通过rules规则组支持同一次配置针对不同原始状态码返回不同应答

名称数据类型填写要求默认值描述
rulesarray of object必填-规则组

rules中每个规则的配置字段如下:

名称数据类型填写要求默认值描述
status_codenumber选填200自定义 HTTP 应答状态码
headersarray of string选填-自定义 HTTP 应答头,key 和 value 用=分隔
bodystring选填-自定义 HTTP 应答 Body
enable_on_statusarray of string or number选填-匹配原始状态码,生成自定义响应。可填写精确值如200404等,也可模糊匹配如2xx(匹配 200-299)、20x(匹配 200-209),x代表任意一位数字。不填写时,不判断原始状态码,取第一个enable_on_status为空的规则作为默认规则

从源码看,配置解析在 main.go 的parseConfig中完成:当配置中存在rules且为数组时走新版本逻辑,逐条解析规则,并将第一个enable_on_status为空的规则记为默认规则(defaultRule);同时把每个enable_on_status条目与规则建立映射(enableOnStatusRuleMap),同一状态码不能被两条规则重复使用,否则插件启动直接失败(返回错误enableOnStatus can only use once)。

模糊匹配规则

模糊匹配模式需同时满足三个条件:

  • 长度为 3
  • 至少一位数字
  • 至少一位x(不区分大小写)
规则匹配内容
40x400-409;前两位为 40 的情况
1x4104,114,124,134,144,154,164,174,184,194;第一位和第三位分别为 1 和 4 的情况
x23023,123,223,323,423,523,623,723,823,923;第二位和第三位为 23 的情况
4xx400-499;第一位为 4 的情况
x4x040-049,140-149,240-249,340-349,440-449,540-549,640-649,740-749,840-849,940-949;第二位为 4 的情况
xx4尾数为 4 的情况

模糊模式的合法性校验在源码 isValidFuzzyMatchString 中实现:长度必须为 3、只能包含数字和x/X、必须同时包含至少一个x和至少一个数字。例如123(缺少x)、xxx(缺少数字)、xYx(非法字符)、x1(长度不足)都会被判定为非法配置,导致插件启动失败,对应测试见 main_test.go。

老版本:只支持一种返回

为兼容旧配置,插件仍然支持不带rules的单规则写法:

名称数据类型填写要求默认值描述
status_codenumber选填200自定义 HTTP 应答状态码
headersarray of string选填-自定义 HTTP 应答头,key 和 value 用=分隔
bodystring选填-自定义 HTTP 应答 Body
enable_on_statusarray of number选填-匹配原始状态码,生成自定义响应,不填写时,不判断原始状态码

老版本配置在解析时会被自动包装成单条规则并作为默认规则处理(见 main.go),因此新旧两种写法可以平滑兼容。

匹配优先级

精确匹配 > 模糊匹配 > 默认配置(第一个enable_on_status为空的配置)

该优先级在响应头处理阶段体现:onHttpResponseHeaders(main.go)先读取上游响应的:status,在enableOnStatusRuleMap中做精确查找,未命中再通过 fuzzyMatchCode 逐模式做模糊匹配(要求模式长度与状态码一致、数字位精确匹配、x位自动放行);若配置中存在默认规则,则在请求头阶段(onHttpRequestHeaders)就直接返回默认应答。

配置示例

以下示例均可直接用于 Higress 网关的插件配置(WasmPlugin 或 Ingress 注解)。使用环境可参考 docker-compose.yaml 与 envoy.yaml 提供的本地 Envoy + echo-server 调试环境。

新版本:不同状态码返回不同应答

rules: - body: '{"hello":"world 200"}' enable_on_status: - 200 - 201 headers: - key1=value1 - key2=value2 status_code: 200 - body: '{"hello":"world 404"}' enable_on_status: - 404 headers: - key1=value1 - key2=value2 status_code: 200

根据该配置,200、201 请求将返回自定义应答:

HTTP/1.1 200 OK Content-Type: application/json key1: value1 key2: value2 Content-Length: 21 {"hello":"world 200"}

404 请求将返回自定义应答:

HTTP/1.1 200 OK Content-Type: application/json key1: value1 key2: value2 Content-Length: 21 {"hello":"world 404"}

注意:应答的状态码由每条规则内的status_code决定,上例中 404 请求虽然命中的是原始404规则,但返回给客户端的是该规则配置的200。关于 Body 对应的Content-Type,源码 parseRuleItem 会自动推断:若 Body 是合法 JSON 则设置为application/json; charset=utf-8,否则为text/plain; charset=utf-8Content-Length则由代理按实际 Body 重新计算,配置中的content-length响应头会被忽略。

新版本:模糊匹配场景

rules: - body: '{"hello":"world 200"}' enable_on_status: - 200 headers: - key1=value1 - key2=value2 status_code: 200 - body: '{"hello":"world 40x"}' enable_on_status: - '40x' headers: - key1=value1 - key2=value2 status_code: 200

根据该配置,200 状态码将返回自定义应答:

HTTP/1.1 200 OK Content-Type: application/json key1: value1 key2: value2 Content-Length: 21 {"hello":"world 200"}

401-409 之间的状态码将返回自定义应答:

HTTP/1.1 200 OK Content-Type: application/json key1: value1 key2: value2 Content-Length: 21 {"hello":"world 40x"}

模糊匹配的位级语义在 main_test.go 的Test_prefixMatchCode中有详尽覆盖:例如101201命中x01203213命中2x3450451命中45x600611612命中6xx171命中x7x228命中xx8,而111161229123均不命中任何模式。

老版本:Mock 应答场景(不同状态码相同应答)

enable_on_status: - 200 status_code: 200 headers: - Content-Type=application/json - Hello=World body: "{\"hello\":\"world\"}"

根据该配置,200 请求将返回自定义应答:

HTTP/1.1 200 OK Content-Type: application/json key1: value1 key2: value2 Content-Length: 21 {"hello":"world"}

触发限流时自定义响应

enable_on_status: - 429 status_code: 302 headers: - Location=https://example.com

触发网关限流时一般会返回429状态码,此时请求将返回自定义应答:

HTTP/1.1 302 Found Location: https://example.com

从而实现基于浏览器 302 重定向机制,将限流后的用户引导到其他页面,比如一个 CDN 上的静态页面。

如果希望触发限流时返回其他应答(而非重定向),参考上述 Mock 应答场景配置相应的status_codeheadersbody字段即可。

配置注意事项与校验规则

结合源码与测试,以下边界情况会导致插件启动失败(对应测试见 main_extra_test.go):

  • headers中某项缺少=SplitN(v, "=", 2)无法拆出 key/value,报错invalid header pair format
  • status_code非数字或超出 100-599 范围:解析报错,-199600等均被拒绝;
  • 同一enable_on_status被多条规则重复使用:报错enableOnStatus can only use once
  • 新版本rules数组为空:既无默认规则也无状态码映射时,报错no valid config is found
  • 上游响应缺少:status:插件采取 fail-soft 策略,仅记录日志并放行(返回ActionContinue),不会发送本地应答,见 main_extra_test.go。

运行与调试

插件源码位于 plugins/wasm-go/examples/custom-response,版本号见 VERSION(当前为 1.1.0)。仓库提供了本地联调环境:

  • docker-compose.yaml:拉起 Higress gateway(Envoy)+ echo-server,将编译产物plugin.wasm挂载到/etc/envoy/plugin.wasm,并可通过--component-log-level wasm:debug开启 Wasm 插件 debug 日志;
  • envoy.yaml:配置了wasmdemoWasm HTTP 过滤器,内嵌了多组注释/启用的配置样例(多规则精确匹配、40x模糊匹配、单规则默认应答等),可直接切换验证上述所有场景;
  • main_test.go 与 main_extra_test.go:覆盖配置解析、请求/响应头阶段的规则命中、模糊匹配矩阵以及各类错误路径,是理解插件行为与回归验证的最佳参考。

整体实现基于 Higress 的 wasm-go 插件框架(github.com/higress-group/proxy-wasm-go-sdkgithub.com/higress-group/wasm-go),核心通过proxywasm.SendHttpResponseWithDetail在认证阶段(请求头/响应头回调)直接向客户端下发本地应答,从而实现零上游访问的 Mock 与状态码改写能力。

【免费下载链接】higress🤖 AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 16:33:57

手机端大模型翻译技术:从云端到移动端的突破

1. 项目概述:手机端运行的大模型翻译技术突破上周在调试一个跨国协作项目时,我偶然发现手机上的腾讯翻译君App更新后响应速度明显提升。仔细研究后发现,这背后是腾讯最新发布的手机端大模型翻译技术——传统需要云端GPU集群运行的百亿参数大模…

作者头像 李华
网站建设 2026/9/16 16:32:04

RTranslator离线实时翻译实测:6GB内存就能跑

RTranslator离线实时翻译实测:6GB内存就能跑 【免费下载链接】RTranslator Open source real-time translation app for Android that runs locally 项目地址: https://gitcode.com/GitHub_Trending/rt/RTranslator 出国数据流量用光的那一刻,你想…

作者头像 李华
网站建设 2026/9/16 16:31:51

STM32F407 USB MIDI实现:从CubeMX配置到端点收发详解

简介:一份基于STM32F407标准库的USB MIDI参考工程,面向需要实现USB Audio类MIDI通信的嵌入式开发者与音乐硬件爱好者。工程遵循USB音频设备类规范,将STM32F407配置为全速USB MIDI设备,完整展示PC与设备间MIDI数据收发流程&#xf…

作者头像 李华
网站建设 2026/9/16 16:30:49

嵌入式架构选型:MCU、MPU与SoC的边界与迁移实战

做嵌入式这些年,我最大的教训是:选 MCU、MPU 还是 SoC,千万别只盯着参数表。五年前做一款工业网关,当时团队最熟的平台是 STM32,方案评审阶段大家一致选 MCU 主控,理由很充分:便宜、功耗低、团队…

作者头像 李华