文档
一个 项目

map

根据输入值设置自定义占位符的值。

它将源值与映射表的输入端进行比较,若匹配,则将输出值应用到每个目标。目标成为占位符名称。也可以为每个目标指定默认输出值。

映射的占位符在被使用前不会被求值,因此即使映射很大,该指令也非常高效。

语法

map [<matcher>] <source> <destinations...> {
	[~]<input> <outputs...>
	default    <defaults...>
}
  • <source> 是要切换的输入值,通常是一个占位符。

  • <destinations...> 是要创建的占位符,用于存储输出值。

  • <input> 是要匹配的输入值。如果以 ~ 为前缀,则视为正则表达式。

  • <outputs...> 是要存储到关联占位符中的一个或多个输出值。第一个输出写入第一个目标,第二个输出写入第二个目标,依此类推。

    特殊情况:Caddyfile 解析器将字面量连字符(-)视为 null/nil 值。如果你希望在某个输入下回退到默认值,但其他输出使用非默认值,这很有用。

    输出值会尽可能进行类型转换;truefalse 会转换为布尔类型,数字会转换为整数或浮点数。若要避免转换,可用引号包裹输出值使其保持字符串。

    每个映射的输出数量不得超过目标数量;但为方便起见,输出可以少于目标,缺失的输出会自动补全。

    如果输入为正则表达式,则可用 ${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