v2中文文档
项目

map

设置根据输入值进行切换的自定义占位符的值。

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

映射的占位符在使用前不会被评估,所以即使是非常大的映射,这个指令也是相当有效的。

Syntax

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

  • <destinations...> 是要创建的容纳输出值的占位符。

  • <input> 是要匹配的输入值。如果前缀带了~,它讲被作为正则表达式处理。

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

    作为一种特殊情况,Caddyfile分析器将字面连字符(-)的输出视为null/nil值。如果你想在给定输入的情况下,对该特定输出使用默认值,但又想对其他输出使用非默认值,这很有用。

    如果可能的话,输出将被转换类型;truefalse将被转换为布尔类型,数字值将被相应地转换为整数或浮点数。为了避免这种转换,你可以用引号来包裹输出,它们将保持为字符串。

    每个映射的输出数量不得超过目标的数量;但是,为了方便起见,输出的数量可以少于目标的数量,任何缺失的输出将被隐含地填入。

    如果使用正则表达式作为输入,那么捕获组可以用${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}分别设置为715。不设置{my_placeholder}
  • 否则(对于所有其他主机),将适用默认值。{my_placeholder}将被设置为unknown domain{magic_number}将被设置为42