Caddyfile 配置文件语法详解
文件和编码
配置文件使用UTF-8编码,其中文件开始的0xFEFF
文件头会被忽略如果存在的话(Windows下记事本会自动添加这个文件头)。
字符串和注释
指令和参数,参数和参数之间使用空格分割,如果参数不包括空格或换行,可以直接使用,包括空格需要使用双引号包含进来,这时候,里面的双引号需要转义\"
,除了双引号可以被转义,其他符号不能被转义。
行以\n
作为分隔符,\r
和空白行和所有空白字符将被忽略,不包括被引号包含的行。
在#
后面到行结束内容将作为注释被忽略,注释可以在指令的后面,也可以单独一行。
结构
以下内容与原文存在一定的差异,但不影响理解。
Caddyfile
里面不存在全局变量。如下图,配置文件由标签
和定义
组成,标签加定义是最基本的单位:
标签由简单的字符串组成,定义则可以由一行或者多行,其中多行需要使用大括号({}
)括起来,大括号的左边({
)和标签同一行,大括号的结束(}
)需要单独占用一行:
缩减推荐使用一个Tab
,文件的第一行永远是标签,空行、注释、import
除外。
标签(一般是绑定的域名)
标签是块之外的唯一元素(import除外),一个标签可以单独一行:
label
或者多个标签放一行
label1 label2 ...
或者多行,末尾需要添加逗号,
label1,
label2
或者以上语法可以混着用,但是官方不推荐这样的做法:
label1 label2,
label3, label4,
label5
指令
指令
跟在标签
后面,一个指令一行,指令后面跟着参数,参数是可选的:
directive1
directive2 arg1 arg2
directive3 arg3
逗号将被识别为参数,而不是分隔符,参数使用空格作为分割符
指令后面可以添加一个块,块里面存放着多个属性或者子参数,块同上面一样,也是使用大括号括起来:
directive arg1 {
subdir arg2 arg3
...
}
块里面不可以再创建块,就是不可以无限嵌套。
环境变量
标签、指令、参数、配置 都可以由环境变量组成,环境变量由Unix和Windows风格,但是不能包含空格:
label_{$ENV_VAR_1}
directive {%ENV_VAR_2%}
两种风格不区分平台,单个变量不会被分割为多个标记或者变量 和参数。
导入配置文件
import
指令比较特殊,可以出现在块之外,import
指令所在行将被替换成导入文件的内容,可以理解为import
指令为预处理,详细语法点击查看。
例子
单入口简单配置事例:
label1
directive1 argument1
directive2
多个标签需要使用括号 括起来:
label1 {
directive1 arg1
directive2
}
label2, label3 {
directive3 arg2
directive4 arg3 arg4
}
单个标签也可以使用大括号包括起来,但是官方不推荐这样做:
label1 {
directive1 arg1
directive2
}
指令单独使用一个块:
label1
directive arg1 {
subdir arg2 arg3
}
directive arg4
下面是比较完整的例子,多个指令构成一个定义,一个定义修饰一个标签:
label1 {
directive1 arg1
directive2 arg2 {
subdir1 arg3 arg4
subdir2
# nested blocks not supported
# 这边不可以再使用大括号
}
directive3
}