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" } }