文档
一个 项目

map

根据输入值为自定义占位符设置值。

它将源值与 map 的输入侧进行比较,对于匹配的项,将把输出值应用到每个目标。目标将成为占位符名称。也可以为每个目标指定默认输出值。

映射的占位符在使用之前不会被求值,因此即使映射非常大,该指令也相当高效。

语法

map [<matcher>] <source> <destinations...> {
	[~]<input> <outputs...>
	default    <defaults...>
}
  • <source> 是要切换的输入值。通常是一个占位符。

  • <destinations...> 是要创建的占位符,用于保存输出值。

  • <input> 是要匹配的输入值。如果以 ~ 为前缀,则视为正则表达式。

  • <outputs...> 是一个或多个要存储到关联占位符的输出值。第一个输出写入第一个目标,第二个输出写入第二个目标,依此类推。

    特殊情况下,Caddyfile 解析器将字面连字符(-)作为空/空值(null/nil)处理。如果在给定输入的情况下你希望对某个特定输出回退到默认值,但又想对其他输出使用非默认值,这一点非常有用。

    输出如果可能会被进行类型转换;truefalse 会被转换为布尔类型,数字值会相应转换为整数或浮点数。若要避免此类转换,可以用引号将输出包裹起来,这样它们将保持为字符串。

    每个映射的输出数量不得超过目标数量;不过为方便起见,输出可以少于目标,任何缺失的输出将被隐式填充。

    如果输入使用了正则表达式,则可以使用 ${group} 引用捕获组,其中 group 是表达式中捕获组的名称或编号。捕获组 0 是完整的正则匹配,1 是第一个捕获组,2 是第二个捕获组,依此类推。

  • <default> 指定在没有任何输入匹配时要存储的输出值。

示例

以下示例演示了该指令的大部分用法:

map {host}                {my_placeholder}  {magic_number} {
	example.com           "some value"      3
	foo.example.com       "another value"
	~(.*)\.example\.com$  "${1} subdomain"  5

	~.*\.net$             -                 7
	~.*\.xyz$             -                 15

	default               "unknown domain"  42
}

该指令根据 {host} 的值进行切换,即请求的域名。

  • 如果请求是 example.com,将 {my_placeholder} 设为 some value,并将 {magic_number} 设为 3
  • 否则,如果请求是 foo.example.com,将 {my_placeholder} 设为 another value,并让 {magic_number} 使用默认值 42
  • 否则,如果请求是 example.com 的任意子域名,将 {my_placeholder} 设为包含第一个正则捕获组值的字符串(即整个子域名),并将 {magic_number} 设为 5
  • 否则,如果请求的主机以 .net.xyz 结尾,仅将 {magic_number} 分别设为 715。保持 {my_placeholder} 未设置。
  • 否则(对于所有其他主机),将应用默认值:{my_placeholder} 被设为 unknown domain{magic_number} 被设为 42