文件
一個 專案

import

包含一個 程式碼片段 或檔案,並將此指令替換為該程式碼片段或檔案的內容。

此指令是一個特例:它在結構解析之前被評估,並且可以出現在 Caddyfile 中的任何位置。

語法

import <pattern> [<args...>] [{block}]
  • <pattern> 是要包含的檔案名稱、glob 模式或程式碼片段的名稱。其內容將替換此行,如同該檔案的內容一開始就出現在這裡一樣。

    如果找不到特定檔案會發生錯誤,但空的 glob 模式不是錯誤。

    如果導入特定檔案,若檔案為空將發出警告。

    如果模式是檔案名稱或 glob,它始終相對於 import 所在檔案的路徑。

    如果使用 glob 模式 * 作為最後的路徑段,則會忽略隱藏檔案(即以 . 開頭的檔案)。要導入隱藏檔案,請使用 .* 作為最後一段。

  • <args...> 是傳遞給導入的 token 的可選參數列表。此佔位符是一個特例,在 Caddyfile 解析時評估,而不是在運行時評估。它們可以以各種形式使用,類似於 Go 的 slice 語法

    • {args[n]} 其中 n 是參數的從 0 開始的位置索引
    • {args[:]} 其中插入所有參數
    • {args[:m]} 其中插入 m 之前的參數
    • {args[n:]} 其中插入從 n 開始的參數
    • {args[n:m]} 其中插入 nm 範圍之間的參數

    對於插入多個 token 的形式,佔位符必須是獨立的 token,它不能是另一個 token 的一部分。換句話說,它周圍必須有空格,並且不能在引號中。

    請注意,在 v2.7.0 之前,語法是 {args.N},但此形式已被棄用,改用更靈活的上述語法。

⚠️ 實驗性 | v2.9.x+

  • {block} 是要傳遞給導入的 token 的可選區塊。此佔位符是一個特例,在 Caddyfile 解析時遞迴評估,而不是在運行時評估。它們可以以兩種形式使用
    • {block} 其中提供的整個區塊的內容將替換佔位符
    • {blocks.key} 其中 key 是提供的區塊中參數的第一個 token

範例

導入相鄰 sites-enabled 資料夾中的所有檔案(除了隱藏檔案)

import sites-enabled/*

導入使用導入參數設定 CORS 標頭的程式碼片段

(cors) {
	@origin header Origin {args[0]}
	header @origin Access-Control-Allow-Origin "{args[0]}"
	header @origin Access-Control-Allow-Methods "OPTIONS,HEAD,GET,POST,PUT,PATCH,DELETE"
}

example.com {
	import cors example.com
}

導入將代理上游列表作為參數的程式碼片段

(https-proxy) {
	reverse_proxy {args[:]} {
		transport http {
			tls
		}
	}
}

example.com {
	import https-proxy 10.0.0.1 10.0.0.2 10.0.0.3
}

導入建立具有前綴重寫規則作為第一個參數的代理的程式碼片段

(proxy-rewrite) {
	rewrite * {args[0]}{uri}
	reverse_proxy {args[1:]}
}

example.com {
	import proxy-rewrite /api 10.0.0.1 10.0.0.2 10.0.0.3
}

⚠️ 實驗性 | v2.9.x+

導入回應可配置的 "hello world" 訊息和 content-type 的程式碼片段

(hello-world) {
	header {
		Cache-Control max-age=3600
		X-Foo bar
		{blocks.content_type}
	}
	respond /hello-world 200 {
		{blocks.body}
	}
}

example.com {
	import hello-world {
		content_type {
			Content-Type text/html
		}
		body {
			body "<h1>hello world</h1>"
		}
	}
}

導入為反向代理提供可擴展選項的程式碼片段

(extendable-proxy) {
	reverse_proxy {
		{blocks.proxy_target}
		{blocks.proxy_options}
	}
}

example.com {
	import extendable-proxy {
		proxy_target {
			to 10.0.0.1
		}
		proxy_options {
			transport http {
				tls
			}
		}
	}
}

導入提供任何指令集,但具有預先載入的中介軟體的程式碼片段

(instrumented-route) {
	header {
		Alt-Svc `h3="0.0.0.0:443"; ma=2592000`
	}
	tracing {
		span args[0]
	}
	{block}
}

example.com {
	import instrumented-route example-com {
		respond "OK"
	}
}