文档
一个 项目

Caddyfile 指令

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

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

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

语法

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

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

<carets> 表示要由实际值替换的标记。

[brackets] 表示可选参数。

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

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

匹配器

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

[<matcher>]

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

指令顺序

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

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

tracing

map
vars
root
skip_log

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
basicauth
forward_auth
request_header
encode
push
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 指令的内容忽略上述所有规则,并保留指令在其中出现的顺序。