import
包含一个 代码片段 或文件,将此指令替换为代码片段或文件的内容。
此指令是一个特殊情况:它在结构解析之前被评估,并且可以出现在 Caddyfile 中的任何位置。
语法
import <pattern> [<args...>] [{block}]
-
<pattern> 是要包含的文件名、glob 模式或代码片段的名称。其内容将替换此行,就像该文件的内容最初出现在这里一样。
如果找不到特定文件,则会出错,但空 glob 模式不是错误。
如果导入特定文件,如果文件为空,将发出警告。
如果模式是文件名或 glob,则它始终相对于
import
出现的文件。如果使用 glob 模式
*
作为最终路径段,则隐藏文件(即以.
开头的文件)将被忽略。要导入隐藏文件,请使用.*
作为最终段。 -
<args...> 是传递给导入令牌的可选参数列表。此占位符是一种特殊情况,在 Caddyfile 解析时而不是运行时评估。它们可以以各种形式使用,类似于 Go 的切片语法
{args[n]}
其中n
是参数的从 0 开始的位置索引{args[:]}
其中插入所有参数{args[:m]}
其中插入m
之前的参数{args[n:]}
其中插入以n
开头的参数{args[n:m]}
其中插入n
和m
之间的参数
对于插入许多令牌的形式,占位符必须是它自己的令牌,它不能是另一个令牌的一部分。换句话说,它必须在其周围有空格,并且不能在引号中。
请注意,在 v2.7.0 之前,语法是
{args.N}
,但此形式已被弃用,取而代之的是更灵活的上述语法。
⚠️ 实验性 | v2.9.x+
- {block} 是一个可选块,用于传递给导入的令牌。此占位符是一种特殊情况,并且在 Caddyfile 解析时而不是运行时递归评估。它们可以以两种形式使用
{block}
其中整个提供的块的内容将被替换为占位符{blocks.key}
其中key
是提供的块中参数的第一个令牌
示例
导入相邻 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”消息和内容类型进行响应的代码片段
(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"
}
}