v2中文文档
项目

响应匹配器

响应匹配器可用于按特定条件过滤(或分类)响应。

它通常只会作为某些指令内部的配置出现,用来在向客户端写出响应时进行判断。

语法

如果某个指令支持响应匹配器,语法文档通常写作[<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状态码列表。特殊写法如2xx3xx分别匹配200-299300-399范围内全部状态码。

示例:

@success status 2xx
header <field> [<value>]

按响应头字段匹配。

  • <field>是要检查的HTTP头字段名。
    • 若以!开头,表示该字段必须不存在才能匹配(此时省略value参数)。
  • <value>是字段必须匹配的值。
    • 若以*开头,表示快速后缀匹配(出现在末尾)。
    • 若以*结尾,表示快速前缀匹配(出现在开头)。
    • 若前后都包裹*,表示快速子串匹配(出现在任意位置)。
    • 否则为快速精确匹配。

同一个集合中,不同字段之间是AND关系;同一字段的多个值是OR关系。

注意:同一个响应头字段可能重复出现且值不同。后端应用必须把响应头字段值视为数组而非单值;遇到这种情况时,Caddy不会解释其语义。

示例:

匹配响应头Foo中包含bar的响应:

@upgrade header Foo *bar*

匹配响应头Foo值为barbaz的响应:

@foo {
	header Foo bar
	header Foo baz
}

匹配完全不包含Foo响应头字段的响应:

@not_foo header !Foo