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
。