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。