import
包含一个 snippet 或文件,用该 snippet 或文件的内容替换此指令。
此指令是一个特殊情况:它在结构解析之前进行求值,并且可以出现在 Caddyfile 的任意位置。
语法
import <pattern> [<args...>] [{block}]
-
<pattern> 是要包含的文件名、glob 模式或 snippet 的名称。其内容将替换此行,就好像该文件的内容一开始就出现在此处一样。
如果找不到指定的文件,则视为错误,但空的 glob 模式不是错误。
如果导入的是特定文件且该文件为空,则会发出警告。
如果 pattern 是文件名或 glob,则始终相对于出现
import的文件。如果使用 glob 模式
*作为最终路径段,则会忽略隐藏文件(即以.开头的文件)。要导入隐藏文件,请使用.*作为最终段。 -
<args...> 是可选的参数列表,用于传递给被导入的 token。该占位符是一个特殊情况,在 Caddyfile 解析时求值,而不是在运行时。它们可以以多种形式使用,类似于 Go 的切片语法:
{args[n]}其中n是参数的 0 起始位置索引{args[:]}插入所有参数{args[:m]}插入索引小于m的参数{args[n:]}插入从n开始的参数{args[n:m]}插入索引在n与m之间的参数
对于插入多个 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 头的 snippet:
(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
}
导入一个接收一系列代理上游作为参数的 snippet:
(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
}
导入一个将前缀重写规则作为第一个参数创建代理的 snippet:
(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”消息和内容类型的 snippet:
(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>"
}
}
}
导入一个为反向代理提供可扩展选项的 snippet:
(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
}
}
}
}
导入一个提供任意一组指令但预先加载了中间件的 snippet:
(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"
}
}