正文重写
Chute 可以使用正则表达式或 JSONPath 表达式在 HTTP 请求和响应正文中搜索并替换内容。对于 HTTPS 流量,这需要启用 MitM 解密。
正文重写规则定义在 [Body Rewrite] 部分中。单个请求可以应用多条规则。
[Body Rewrite]
^https://api\.example\.com/response response regex "old-text" "new-text"
^https://api\.example\.com/request request regex "sensitive" "[redacted]"
^https://api\.example\.com/data jsonpath-response jsonpath $.ads null
规则格式
每条规则遵循以下通用格式:
<URL 正则> [方向] <模式> <模式表达式> <替换内容>
方向
| 关键字 | 说明 |
|---|---|
response |
应用于响应正文(省略时的默认值) |
request |
应用于请求正文 |
模式
| 模式 | 说明 |
|---|---|
regex |
正则表达式搜索替换 |
jsonpath-response / jsonpath-request / body-jsonpath-response / body-jsonpath-request |
基于 JSONPath 的修改 |
正则模式
对解码后的正文字符串执行标准的正则查找替换。使用 NSRegularExpression (ICU),不区分大小写匹配。替换内容支持捕获组引用($1、$2 等)。
<URL 正则> [response|request] regex <模式表达式> <替换内容>
示例 — 从 JSON 响应中移除广告:
[Body Rewrite]
^https://api\.example\.com/feed response regex "\"ads\":\s*\[.*?\]" "\"ads\":[]"
示例 — 清洗请求正文:
[Body Rewrite]
^https://api\.example\.com/submit request regex "\"password\":\s*\".*?\"" "\"password\":\"[FILTERED]\""
示例 — 使用捕获组重新格式化数据:
[Body Rewrite]
// 将 "last, first" 转换为 "first last"
^https://api\.example\.com/users response regex "\"name\":\s*\"(\\w+),\\s*(\\w+)\"" "\"name\":\"$2 $1\""
示例 — 重写响应正文中的内嵌 URL:
[Body Rewrite]
^https://api\.example\.com response regex "https://old-cdn\\.example\\.com" "https://new-cdn.example.com"
包含空格的标记必须用双引号括起来:
[Body Rewrite]
^https://example\.com response regex "old value with spaces" "new value"
要在引号标记中包含字面的双引号,请使用反斜杠转义:\"。
JSONPath 模式
使用 JSONPath 表达式修改 JSON 正文。支持在特定路径读取、设置和删除值。
<URL 正则> jsonpath-response|jsonpath-request jsonpath <jsonpath-表达式> [值]
支持的 JSONPath 语法
| 表达式 | 说明 |
|---|---|
$.key |
访问对象属性 |
$.key.subkey |
访问嵌套属性 |
$[0] |
按索引访问数组元素 |
$.key[0].subkey |
混合对象和数组访问 |
$.items[*].name |
通配符:数组中的所有元素 |
$.*.value |
通配符:所有属性 |
值类型
| 值 | 结果 |
|---|---|
"string" |
设置为字符串值 |
42 |
设置为整数 |
3.14 |
设置为浮点数 |
true |
设置为布尔值 true |
false |
设置为布尔值 false |
null 或省略 |
删除该路径 |
示例 — 设置 JSON 字段:
[Body Rewrite]
^https://api\.example\.com/profile jsonpath-response jsonpath $.user.name "Anonymous"
示例 — 删除 JSON 字段:
[Body Rewrite]
^https://api\.example\.com/data jsonpath-response jsonpath $.tracking null
示例 — 通配符修改:
[Body Rewrite]
^https://api\.example\.com/list jsonpath-response jsonpath $.items[*].hidden true
实践示例
从 JSON 响应中剥离追踪参数
从所有 API 响应中移除 trackingId 和 sessionId 字段:
[Body Rewrite]
^https://api\.example\.com/ jsonpath-response jsonpath $.trackingId null
^https://api\.example\.com/ jsonpath-response jsonpath $.sessionId null
向 HTML 响应注入脚本标签
在所有 HTML 页面的 </body> 之前追加自定义 <script> 标签:
[Body Rewrite]
^https://www\.example\.com/ response regex "</body>" "<script>console.log('injected')</script></body>"
在请求日志中编辑敏感字段
在请求正文到达服务器之前替换掉其中的 API 密钥和令牌:
[Body Rewrite]
^https://api\.example\.com/ request regex "\"apiKey\":\s*\"[^\"]+\"" "\"apiKey\":\"[REDACTED]\""
^https://api\.example\.com/ request regex "\"token\":\s*\"[^\"]+\"" "\"token\":\"[REDACTED]\""
规范化响应中的日期格式
将 ISO 日期替换为更短的格式:
[Body Rewrite]
^https://api\.example\.com/ response regex "(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z" "$1/$2/$3 $4:$5"
禁用应用配置中的功能开关
强制将配置端点中的所有功能开关设为 false:
[Body Rewrite]
^https://api\.example\.com/config jsonpath-response jsonpath $.features[*].enabled false
重写缓存响应中的 CDN URL
将对旧 CDN 的所有引用替换为新的 CDN:
[Body Rewrite]
^https://www\.example\.com/ response regex "https://old-cdn\.example\.com" "https://new-cdn.example.com"
处理管线
正文重写自动处理以下内容:
- Content-Encoding:支持
gzip和deflate。跳过不支持的编码。 - Transfer-Encoding:在处理前对分块传输编码进行去块化。
- 解码:在应用重写规则之前解压缩正文。
- 重新编码:重新压缩正文并更新
Content-Length。移除Transfer-Encoding头部。
默认情况下,重写处理的正文最大大小为 128KB。大于此值的正文将直接透传而不做修改。
注意事项
- 对于 HTTPS 流量,必须为匹配的主机名启用 MitM 解密。
- 正则匹配不区分大小写。替换模板支持 ICU 捕获组引用:
$0(完整匹配)、$1(第一组)、$2(第二组)等。 - JSONPath 模式仅在正文是有效 JSON 时适用。
- 正文重写规则应用于解码后(UTF-8)的正文文本。
- 多条规则可以对同一个请求/响应进行匹配和应用(按定义的顺序应用)。
- 当规则通过 JSONPath 设置或删除一个不存在的值时,正文将保持不变。