文档
一个 项目

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

    对于插入许多令牌的形式,占位符必须是它自己的令牌,它不能是另一个令牌的一部分。换句话说,它必须在其周围有空格,并且不能在引号中。

    请注意,在 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"
	}
}