响应匹配器
响应匹配器可用于按特定条件过滤(或分类)响应。
它通常只会作为某些指令内部的配置出现,用来在向客户端写出响应时进行判断。
语法
如果某个指令支持响应匹配器,语法文档通常写作[<response_matcher>]或[<inline_response_matcher>]。
- **<response_matcher>**可以是已声明的命名响应匹配器名称。例如:
@name。 - **<inline_response_matcher>**可以直接写响应条件本身,无需提前声明。例如:
status 200。
命名形式
@name { status <code...> header <field> [<value>] }
如果指令只关心响应的一个维度,也可以把名称和条件写在同一行:
@name status <code...>
内联形式
... { status <code...> header <field> [<value>] }
... status <code...>
... header <field> [<value>]
匹配器
status
status <code...>
按HTTP状态码匹配。
- **<code...>**是HTTP状态码列表。特殊写法如
2xx和3xx分别匹配200-299与300-399范围内全部状态码。
示例:
@success status 2xx
header
header <field> [<value>]
按响应头字段匹配。
<field>是要检查的HTTP头字段名。- 若以
!开头,表示该字段必须不存在才能匹配(此时省略value参数)。
- 若以
<value>是字段必须匹配的值。- 若以
*开头,表示快速后缀匹配(出现在末尾)。 - 若以
*结尾,表示快速前缀匹配(出现在开头)。 - 若前后都包裹
*,表示快速子串匹配(出现在任意位置)。 - 否则为快速精确匹配。
- 若以
同一个集合中,不同字段之间是AND关系;同一字段的多个值是OR关系。
注意:同一个响应头字段可能重复出现且值不同。后端应用必须把响应头字段值视为数组而非单值;遇到这种情况时,Caddy不会解释其语义。
示例:
匹配响应头Foo中包含bar的响应:
@upgrade header Foo *bar*
匹配响应头Foo值为bar或baz的响应:
@foo { header Foo bar header Foo baz }
匹配完全不包含Foo响应头字段的响应:
@not_foo header !Foo