map
根据输入值设置自定义占位符的值。
它将源值与映射表的输入端进行比较,若匹配,则将输出值应用到每个目标。目标成为占位符名称。也可以为每个目标指定默认输出值。
映射的占位符在被使用前不会被求值,因此即使映射很大,该指令也非常高效。
语法
map [<matcher>] <source> <destinations...> {
[~]<input> <outputs...>
default <defaults...>
}
-
<source> 是要切换的输入值,通常是一个占位符。
-
<destinations...> 是要创建的占位符,用于存储输出值。
-
<input> 是要匹配的输入值。如果以
~
为前缀,则视为正则表达式。 -
<outputs...> 是要存储到关联占位符中的一个或多个输出值。第一个输出写入第一个目标,第二个输出写入第二个目标,依此类推。
特殊情况:Caddyfile 解析器将字面量连字符(
-
)视为 null/nil 值。如果你希望在某个输入下回退到默认值,但其他输出使用非默认值,这很有用。输出值会尽可能进行类型转换;
true
和false
会转换为布尔类型,数字会转换为整数或浮点数。若要避免转换,可用引号包裹输出值使其保持字符串。每个映射的输出数量不得超过目标数量;但为方便起见,输出可以少于目标,缺失的输出会自动补全。
如果输入为正则表达式,则可用
${group}
引用捕获组,其中group
是表达式中捕获组的名称或编号。捕获组0
是完整匹配,1
是第一个捕获组,依此类推。 -
<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
。