v2中文文档
项目

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]}插入nm之间的参数

    对于插入许多令牌的表单,占位符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"
	}
}