跳转到内容

响应改写

此页面由 docs/rules/response-modification.md 自动同步生成。

本章介绍修改返回给客户端的响应内容的规则。


设置或修改响应头部。

pattern resHeaders://key=value # 内联格式(单个头)
pattern resHeaders://(key1: value1) # 小括号格式(可包含空格)
pattern resHeaders://{"key1":"value1","key2":"value2"} # JSON 对象格式(多个头,不能包含未包裹空格)
pattern resHeaders://({"key1":"value with space"}) # 小括号 JSON 格式(可包含空格)
pattern resHeaders://{varName} # 引用内嵌值/Values(推荐)

⚠️ 重要

  1. {name} 是引用内嵌值的语法,不是直接定义 JSON!
  2. JSON 对象只有在内容是合法 JSON object 时才会被当成多个 header;{my-res-headers} 仍然是 value 引用
  3. 小括号内容会作为一个整体解析,可以包含空格;多行或多个头部建议使用块变量
  4. 非 JSON 行格式中的逗号会被拆分;需要携带逗号的头部值时,请使用小括号 JSON,例如 resHeaders://({"Cache-Control":"max-age=3600, public"})
Terminal window
# 内联格式设置单个头
www.example.com resHeaders://X-Custom-Header=custom-value
# 小括号格式
www.example.com resHeaders://(X-Version: 1.0)
# JSON 对象格式(适合 agent 生成的短 header map)
www.example.com resHeaders://{"X-Env":"ppe","X-Flag":"1"}
# 引用内嵌值(推荐,支持空格和多个头)
www.example.com resHeaders://{my-res-headers}

内嵌值定义:

``` my-res-headers
X-Version: 1.0
X-Server: bifrost
```
Terminal window
# 添加安全头部
www.example.com resHeaders://(X-Frame-Options: DENY)
# 设置缓存控制(使用内嵌值处理空格)
www.example.com resHeaders://{cache-headers}
# 添加调试信息
www.example.com resHeaders://X-Debug-Info=proxy-enabled
测试场景规则预期
内联格式test.com resHeaders://X-Custom=value响应包含 X-Custom: value
小括号格式test.com resHeaders://(X-A: 1)响应包含 X-A 头部
覆盖已有头部test.com resHeaders://Content-Type=text/plainContent-Type 被覆盖

设置响应 Set-Cookie 头部。

pattern resCookies://name=value # 内联格式
pattern resCookies://(name: value) # 小括号格式(可包含空格)
pattern resCookies://{varName} # 引用内嵌值(推荐)

⚠️ 注意:小括号内容会作为一个整体解析,可以包含空格;多个 Cookie 或带属性的复杂值建议使用块变量

Terminal window
# 内联格式
www.example.com resCookies://session=abc123
# 小括号格式
www.example.com resCookies://(token: xyz789)
# 引用内嵌值(多个 Cookie,推荐)
www.example.com resCookies://{my-cookies}
Terminal window
# 带属性的 Cookie(属性必须用 JSON 对象形式)
www.example.com resCookies://{auth-cookie}

内嵌值定义:

``` auth-cookie
{"auth": {"value": "token123", "path": "/", "httpOnly": true, "secure": true}}
```

⚠️ 注意:Cookie 属性必须使用上面的 JSON 对象形式。name: value; attr; attr 这种裸形式只会把整段当作 Cookie 值,其中的分号会被百分号转义为 %3B(例如 auth=token123%3B path=/%3B httpOnly%3B secure),无法生成带属性的 Cookie。

测试场景规则预期
内联格式test.com resCookies://session=abcSet-Cookie 包含 session=abc
小括号格式test.com resCookies://(a: 1)响应包含 Set-Cookie

快速设置 CORS(跨域资源共享)响应头。

pattern resCors://*
pattern resCors://https://app.example.com
pattern resCors://{options}
Terminal window
# 允许所有来源
www.example.com resCors://*
# 允许特定来源
www.example.com resCors://https://app.example.com

⚠️ 关于 resCors://<origin> 指定字面来源:当前实现对可解析(真实存在)的来源主机名存在异常——并不总是原样回显该字符串,可能返回 *、空值,甚至抓取真实站点内容作为头部值(这是一个待修复的缺陷)。在能可靠回显字面来源之前,文档与测试请使用不可解析的来源(如 https://app.testhttps://app.example.com)来验证回显行为。

⚠️ 关于 resCors://*:当请求带有 Origin 头时,bifrost 会回显该请求的 Origin(而非字面 *),以便与凭证一起使用;只有在请求不带 Origin 头时才返回字面 *。此时 Access-Control-Allow-Credentials 默认即为 true

Terminal window
# 完整 CORS 配置(使用内嵌值)
www.example.com resCors://{cors-config}

内嵌值定义:

``` cors-config
origin: *
credentials: true
methods: GET,POST,PUT
headers: X-Custom
maxAge: 86400
expose: X-Trace-Id
```

说明:

  • 支持 JSON 值,也支持上面的多行 key: value 格式
  • 未配置(省略)origin 选项时默认回退为 *;显式将 origin 设为空值会原样输出空的 Access-Control-Allow-Origin 头,不会回退为 *
  • credentials 默认即为 true:未显式配置时也会返回 Access-Control-Allow-Credentials: true,需要关闭时显式设置 credentials: false
  • 未配置时,methods 默认为 GET, POST, PUT, DELETE, OPTIONS, PATCHheadersexpose 默认为 *
选项对应头部说明
originAccess-Control-Allow-Origin允许的来源
methodsAccess-Control-Allow-Methods允许的方法
headersAccess-Control-Allow-Headers允许的请求头
credentialsAccess-Control-Allow-Credentials是否允许携带凭证
maxAgeAccess-Control-Max-Age预检请求缓存时间
exposeAccess-Control-Expose-Headers暴露给客户端的头部
测试场景规则预期
允许所有来源test.com resCors://*Access-Control-Allow-Origin: *
特定来源test.com resCors://https://app.testAccess-Control-Allow-Origin: https://app.test
详细配置test.com resCors://{cors-config}返回 methods / headers / max-age 等完整 CORS 头

设置响应的 Content-Type 头部。

pattern resType://content_type
类型
JSONapplication/json
HTMLtext/html
JavaScriptapplication/javascript
CSStext/css
纯文本text/plain
XMLapplication/xml
图片image/png, image/jpeg
Terminal window
# 设置为 JSON
www.example.com resType://application/json
# 设置为 HTML
www.example.com resType://text/html
# 强制下载
www.example.com resType://application/octet-stream
测试场景规则预期
设置 JSONtest.com resType://application/jsonContent-Type: application/json
设置 HTMLtest.com resType://text/htmlContent-Type: text/html

设置响应的字符编码。

pattern resCharset://charset
Terminal window
# 设置 UTF-8
www.example.com resCharset://utf-8
# 设置 GBK
www.example.com resCharset://gbk
# 设置 ISO-8859-1
www.example.com resCharset://iso-8859-1
测试场景规则预期
UTF-8 编码test.com resCharset://utf-8Content-Type 包含 charset=utf-8

这些协议用于设置额外响应元数据。cacheattachment 在下方有独立章节。

pattern responseFor://value
pattern trailers://{trailer-headers}
Terminal window
# 添加 x-bifrost-response-for 响应头
api.example.com responseFor://mock
# 设置响应 trailers(使用内嵌值)
api.example.com trailers://{debug-trailers}

内嵌值定义:

``` debug-trailers
X-Trace-Id: abc123
X-Debug: true
```

局部替换响应头内容。

pattern headerReplace://res.header_name:old_substring=new_substring

⚠️ 注意:headerReplace 执行的是字面子串替换(str::replace),不支持正则。patternreplacement 以第一个 = 分隔,因此 pattern 中不能包含 =

Terminal window
# 替换 Content-Type
www.example.com headerReplace://res.content-type:text/plain=application/json
# 替换字面子串
www.example.com headerReplace://res.server:nginx=custom-server

若要覆盖 Cache-Control,请使用 cache://0 / cache://N,而不是 headerReplace(pattern 中不能含 =,且不支持正则)。

测试场景规则预期
简单替换test.com headerReplace://res.server:nginx=customServer 中 nginx 被替换
子串替换test.com headerReplace://res.content-type:json=textapplication/json 变为 application/text

控制响应缓存行为。

pattern cache://seconds
pattern cache://{options}
Terminal window
# 缓存 1 小时
www.example.com cache://3600
# 禁用缓存
www.example.com cache://0
# 缓存一天
www.example.com cache://86400
测试场景规则预期
设置缓存test.com cache://3600Cache-Control 设置 max-age=3600
禁用缓存test.com cache://0响应头包含 no-cache 相关指令

设置响应为附件下载。

pattern attachment://filename
Terminal window
# 设置下载文件名
www.example.com/api/export attachment://data.csv
# 动态文件名(模板变量 ${now} 会被替换,反引号可选)
www.example.com/report attachment://report_${now}.pdf
测试场景规则预期
设置附件名test.com attachment://file.txtContent-Disposition: attachment; filename=“file.txt”

响应修改规则可以组合使用:

Terminal window
# 多个响应头 + CORS(使用内嵌值)
www.example.com resHeaders://{my-headers} resCors://*
# 类型 + 编码
www.example.com resType://text/html resCharset://utf-8
# 配合路由规则
www.example.com host://backend.local resHeaders://{proxy-headers} resCors://*
# 配合过滤器
www.example.com resCors://* includeFilter://m:OPTIONS

  1. 头部覆盖:设置已存在的头部会覆盖原值
  2. CORS 预检resCors 只会在响应上追加 CORS 响应头(Allow-Origin / Methods / Headers / Credentials / Expose,配置了 maxAge 时再加 Max-Age);它不会自动应答 OPTIONS 预检请求——OPTIONS 仍会被转发到上游
  3. Cookie 安全:生产环境建议使用 httpOnlysecure 属性
  4. 缓存控制cache://0 会同时设置 no-cache, no-store, must-revalidate