Skip to content

规则优先级

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

本章介绍 Bifrost 规则的优先级和执行顺序。


Bifrost 规则的执行遵循两个核心原则:

  1. 转发类规则:前面的优先级高,第一个匹配的生效
  2. 修改类规则:相同部位的操作会合并,后面的覆盖前面的

转发类规则决定请求的目标地址,只有第一个匹配的规则生效

协议说明
host重定向到指定主机
xhost强制重定向(优先级更高)
proxyHTTP 代理转发
pacPAC 路由
http / https显式协议转发
ws / wssWebSocket 转发
redirectURL 重定向

执行特点

  • 第一个匹配的转发规则生效,后续转发规则被忽略
  • xhost 优先级高于普通 host

修改类规则对请求/响应进行修改,相同类型的规则会合并执行

协议说明合并行为
reqHeaders请求头后面覆盖前面
resHeaders响应头后面覆盖前面
reqCookies请求 Cookie后面覆盖前面
resCookies响应 Cookie后面覆盖前面
urlParamsURL 参数后面覆盖前面
reqBody请求 Body最后一个生效
resBody响应 Body最后一个生效
statusCode状态码最后一个生效

Terminal window
# 规则文件中定义顺序
www.example.com host://server1.local
www.example.com host://server2.local

结果:请求转发到 server1.local(第一个匹配的生效)

Terminal window
# xhost 优先于 host
www.example.com host://server1.local
www.example.com xhost://server2.local

结果:请求转发到 server2.local(xhost 优先级更高)

Terminal window
# host 和 proxy 是互斥的
www.example.com host://server.local
www.example.com proxy://proxy.local:8080

结果:请求转发到 server.local(host 先匹配)

测试场景规则预期结果
host 顺序test.com host://s1 + test.com host://s2转发到 s1
xhost 优先test.com host://s1 + test.com xhost://s2转发到 s2
host 先于 proxytest.com host://s1 + test.com proxy://p1:8080转发到 s1

Terminal window
# 同一字段,后面覆盖前面
www.example.com reqHeaders://(X-Custom:value1)
www.example.com reqHeaders://(X-Custom:value2)

结果:请求头 X-Custom 的值为 value2

Terminal window
# 不同字段,都会添加
www.example.com reqHeaders://(X-Header-A:valueA)
www.example.com reqHeaders://(X-Header-B:valueB)

结果:请求头同时包含 X-Header-A: valueAX-Header-B: valueB

Terminal window
# 不同 Cookie 合并,相同 Cookie 覆盖
www.example.com reqCookies://(a:1)
www.example.com reqCookies://(b:2)
www.example.com reqCookies://(a:99)

结果:Cookie 包含 a=99; b=2

Terminal window
# 不同参数合并,相同参数覆盖
www.example.com urlParams://(x:1)
www.example.com urlParams://(y:2)
www.example.com urlParams://(x:99)

结果:URL 参数 ?x=99&y=2

Terminal window
# Body 只能有一个,最后一个生效
www.example.com resBody://(body1)
www.example.com resBody://(body2)

结果:响应 Body 为 body2

测试场景规则预期结果
头部覆盖reqHeaders://(X:1) + reqHeaders://(X:2)X: 2
头部合并reqHeaders://(A:1) + reqHeaders://(B:2)A: 1, B: 2
Cookie 覆盖reqCookies://(a:1) + reqCookies://(a:2)a=2
Cookie 合并reqCookies://(a:1) + reqCookies://(b:2)a=1; b=2
参数覆盖urlParams://(x:1) + urlParams://(x:2)x=2
参数合并urlParams://(x:1) + urlParams://(y:2)x=1&y=2
Body 最后生效resBody://(a) + resBody://(b)b

转发规则和修改规则可以同时生效:

Terminal window
# 转发 + 修改同时生效
www.example.com host://backend.local reqHeaders://(X-Proxy:true)
www.example.com reqHeaders://(X-Version:2)

结果

  • 请求转发到 backend.local(转发规则)
  • 请求头包含 X-Proxy: trueX-Version: 2(修改规则合并)
测试场景规则预期结果
转发+修改host://s1 reqHeaders://(A:1) + reqHeaders://(B:2)转发 s1, 头部 A+B
多转发+修改host://s1 + host://s2 reqHeaders://(X:1)转发 s1, 头部 X:1

Terminal window
# 同一行的规则同时应用
www.example.com host://backend.local reqHeaders://(X-A:1) resHeaders://(X-B:2)
Terminal window
# 多行规则按顺序处理
www.example.com host://backend.local
www.example.com reqHeaders://(X-A:1)
www.example.com resHeaders://(X-B:2)

两种写法效果相同:转发到 backend.local,添加请求头 X-A 和响应头 X-B


  1. xhost
  2. host / proxy / pac / http / https / ws / wss / redirect
  3. 同类型:先定义的优先
  1. 相同字段/参数:后定义的覆盖前面的
  2. 不同字段/参数:全部合并
  3. Body/StatusCode:最后定义的生效

  1. 转发规则互斥:一个请求只能转发到一个目标
  2. 修改规则可叠加:多个修改规则可以同时生效
  3. xhost 更强xhost 会覆盖普通 host
  4. 顺序敏感:规则文件中的定义顺序会影响最终结果
  5. 调试技巧:使用 Bifrost 管理端的 Traffic/Network 面板查看实际生效的规则