map
设置根据输入值切换的自定义占位符的值。
它将源值与 map 的输入侧进行比较,对于匹配项,它将输出值应用于每个目标。目标成为占位符名称。也可以为每个目标指定默认输出值。
映射的占位符在被使用时才会被评估,因此即使对于非常大的映射,此指令也非常高效。
语法
map [<matcher>] <source> <destinations...> {
[~]<input> <outputs...>
default <defaults...>
}
-
<source> 是要切换的输入值。通常是占位符。
-
<destinations...> 是要创建的用于保存输出值的占位符。
-
<input> 是要匹配的输入值。如果以
~
为前缀,则将其视为正则表达式。 -
<outputs...> 是要存储在关联占位符中的一个或多个输出值。第一个输出写入第一个目标,第二个输出写入第二个目标,依此类推。
作为特殊情况,Caddyfile 解析器将字面连字符 (
-
) 的输出视为 null/nil 值。如果您想在给定输入的情况下回退到该特定输出的默认值,但又想为其他输出使用非默认值,这将非常有用。输出将尽可能进行类型转换;
true
和false
将转换为布尔类型,数值将相应地转换为整数或浮点数。要避免这种转换,您可以将输出用 引号 括起来,它们将保持字符串类型。每个映射的输出数量不得超过目标数量;但是,为了方便起见,输出数量可能少于目标数量,任何缺少的输出都将隐式填充。
如果正则表达式用作输入,则可以使用
${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}
分别设置为7
或15
。保持{my_placeholder}
不设置。 - 否则(对于所有其他主机),将应用默认值:
{my_placeholder}
将设置为unknown domain
,{magic_number}
将设置为42
。