文档
一个 项目,由 ZeroSSL 提供支持

Caddyfile 指令

指令是出现在站点 中的功能性关键字。有时,它们可能会打开自己的块,其中可以包含子指令,但除非另有说明,否则指令不能在其他指令中使用。例如,您不能在 file_server 块内使用 basic_auth,因为 file_server 不知道如何进行身份验证。但是,您可以在特殊的指令块(如 handleroute)中使用某些指令,因为它们是专门设计用于对 HTTP 处理程序指令进行分组的。

以下指令是 Caddy 的标准配置,可以在 HTTP Caddyfile 中使用

指令 描述
abort 中止 HTTP 请求
acme_server 嵌入式 ACME 服务器
basic_auth 强制执行 HTTP 基本身份验证
bind 自定义服务器的套接字地址
encode 编码(通常压缩)响应
error 触发错误
file_server 从磁盘提供文件服务
forward_auth 将身份验证委托给外部服务
fs 设置用于文件 I/O 的文件系统
handle 指令的互斥组
handle_errors 定义用于处理错误的路由
handle_path 类似于 handle,但剥离路径前缀
header 设置或删除响应标头
import 包含代码片段或文件
intercept 拦截其他处理程序写入的响应
invoke 调用命名路由
log 启用访问/请求日志记录
log_append 将字段附加到访问日志
log_skip 跳过匹配请求的访问日志记录
log_name 覆盖要写入的记录器名称
map 将输入值映射到一个或多个输出
method 在内部更改 HTTP 方法
metrics 配置 Prometheus 指标暴露端点
php_fastcgi 通过 FastCGI 提供 PHP 站点服务
push 使用 HTTP/2 服务器推送将内容推送到客户端
redir 向客户端发出 HTTP 重定向
request_body 操作请求体
request_header 操作请求标头
respond 向客户端写入硬编码的响应
reverse_proxy 功能强大且可扩展的反向代理
rewrite 在内部重写请求
root 设置站点根目录的路径
route 一组指令,被视为单个单元
templates 在响应上执行模板
tls 自定义 TLS 设置
tracing 与 OpenTelemetry 跟踪集成
try_files 取决于文件是否存在的重写
uri 操作 URI
vars 设置任意变量

语法

每个指令的语法看起来都像这样

directive [<matcher>] <args...> {
	subdirective [<args...>]
}

<尖括号> 表示要替换为实际值的标记。

[方括号] 表示可选参数。

省略号 ... 表示延续,即一个或多个参数或行。

子指令通常是可选的,除非另有文档说明,即使它们没有出现在 [方括号] 中。

匹配器

大多数(但不是全部)指令接受匹配器标记,这些标记允许您过滤请求。匹配器标记通常是可选的。如果指令的语法中看到以下内容,则指令支持匹配器

[<matcher>]

由于匹配器标记的工作方式都相同,因此不会在每个页面上描述匹配器标记的各种可能性,以减少重复。相反,请参阅匹配器文档,以获得语法的详细解释。

指令顺序

许多指令会操作 HTTP 处理程序链。这些指令的评估顺序很重要,因此 Caddy 中硬编码了一个默认顺序。

您可以使用order 全局选项route 指令来覆盖/自定义此顺序。

tracing

map
vars
fs
root
log_append
log_skip
log_name

header
copy_response_headers # only in reverse_proxy's handle_response block
request_body

redir

# incoming request manipulation
method
rewrite
uri
try_files

# middleware handlers; some wrap responses
basic_auth
forward_auth
request_header
encode
push
intercept
templates

# special routing & dispatching directives
invoke
handle
handle_path
route

# handlers that typically respond to requests
abort
error
copy_response # only in reverse_proxy's handle_response block
respond
metrics
reverse_proxy
php_fastcgi
file_server
acme_server

排序算法

为了易于使用,Caddyfile 适配器根据以下规则对指令进行排序

  • 不同名称的指令按其在默认顺序中的位置排序。可以使用order 全局选项覆盖默认顺序。来自插件的指令没有顺序,因此应使用order 全局选项或route 指令来设置一个顺序。

  • 相同名称的指令根据其匹配器排序。

    • 最高优先级是具有单个路径匹配器的指令。

      路径匹配器按特异性排序,从最具体到最不具体。

      通常,这是通过按路径匹配器的长度排序来执行的。有一个例外,如果路径以 * 结尾,并且两个匹配器的路径在其他方面相同,则没有 * 的匹配器被认为更具体并且排序更高。

      例如

      • /foobar/foo 更具体
      • /foo/foo* 更具体
      • /foo/*/foo* 更具体
    • 具有任何其他匹配器的指令接下来排序,按照它在 Caddyfile 中出现的顺序。

      这包括具有多个值的路径匹配器和命名匹配器

    • 没有匹配器(即匹配所有请求)的指令最后排序。

  • vars 指令的匹配器排序被反转,因为它涉及设置可以相互覆盖的值,因此最具体的匹配器应最后评估。

  • route 指令的内容忽略上述所有规则,并保留指令在其中出现的顺序。