map
根据输入值设置自定义占位符的值。
它将源值与映射的输入端进行比较,并对匹配的输入端,将输出值应用于每个目标。目标将成为占位符名称。还可以为每个目标指定默认输出值。
映射的占位符直到使用时才会被评估,因此即使对于非常大的映射,此指令也非常高效。
语法
map [<matcher>] <source> <destinations...> {
[~]<input> <outputs...>
default <defaults...>
}
-
<source> 是要切换的输入值。通常是一个占位符。
-
<destinations...> 是要创建的包含输出值的占位符。
-
<input> 是要匹配的输入值。如果以
~
为前缀,则将其视为正则表达式。 -
<outputs...> 是一个或多个要存储在关联占位符中的输出值。第一个输出写入第一个目标,第二个输出写入第二个目标,依此类推。
作为特殊情况,Caddyfile 解析器将文字连字符 (
-
) 作为输出视为空/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
。