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。