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