文件和编码

配置文件使用UTF-8编码,其中文件开始的0xFEFF文件头会被忽略如果存在的话(Windows下记事本会自动添加这个文件头)。

字符串和注释

指令和参数,参数和参数之间使用空格分割,如果参数不包括空格或换行,可以直接使用,包括空格需要使用双引号包含进来,这时候,里面的双引号需要转义\",除了双引号可以被转义,其他符号不能被转义。

行以\n作为分隔符,\r和空白行和所有空白字符将被忽略,不包括被引号包含的行。

#后面到行结束内容将作为注释被忽略,注释可以在指令的后面,也可以单独一行。

结构

以下内容与原文存在一定的差异,但不影响理解。

Caddyfile里面不存在全局变量。如下图,配置文件由标签定义组成,标签加定义是最基本的单位:
Screenshot-2017-12-25 The Caddyfile Syntax.png

标签由简单的字符串组成,定义则可以由一行或者多行,其中多行需要使用大括号({})括起来,大括号的左边({)和标签同一行,大括号的结束(})需要单独占用一行:
Screenshot-2017-12-25 The Caddyfile Syntax(1).png

缩减推荐使用一个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
}

原文地址:https://caddyserver.com/docs/caddyfile