v2中文文档
项目

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 像处理器,但去掉路径前缀
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的tracing
try_files 取决于文件的存在的重写
uri 操作URL
vars 设置任意变量

语法

每个指令的语法如下所示:

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

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

[]表示可选参数。

...表示延续,即一个或多个参数,或者多行。

除非另有说明,否则子指令始终是可选的,即使它们没有出现在[].

匹配器

大多数——但不是全部——指令接受匹配器标记,它可以让你过滤请求。匹配器标记通常是可选的。如果你在指令的语法中看到这一点:

[<matcher>]

然后该指令接受一个匹配器令牌,让你过滤该指令适用于哪些请求。

由于匹配器标记的工作方式相同,因此不会在每一页上都描述匹配器令牌的各种可能性,以减少重复。如果想了解详情,请统一参考匹配器文档

指令顺序

许多指令操纵HTTP处理程序链。这些指令的默认顺序已经被硬编码到Caddy中,评估其顺序是很重要的事情:

tracing

map
vars
fs
root
log_append
log_skip
log_name

header
copy_response_headers # 仅在 reverse_proxy 的 handle_response 块中可用
request_body

redir

# 传入请求操作
method
rewrite
uri
try_files

# 中间件处理器;其中一些会包装响应
basic_auth
forward_auth
request_header
encode
push
intercept
templates

# 特殊路由和分派指令
invoke
handle
handle_path
route

# 通常会响应请求的处理器
abort
error
copy_response # 仅在 reverse_proxy 的 handle_response 块中可用
respond
metrics
reverse_proxy
php_fastcgi
file_server
acme_server

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

排序算法

为了便于使用,Caddyfile适配器会按照以下规则对指令排序:

  • 不同名称的指令会根据它们在默认顺序中的位置排序。默认顺序可以通过order全局选项覆盖。插件提供的指令 没有 顺序,因此应使用order全局选项或route指令来设置顺序。

  • 同名指令会根据它们的匹配器排序。

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

      路径匹配器会按具体程度排序,从最具体到最不具体。

      一般来说,这是按路径匹配器长度排序。有一个例外:如果路径以*结尾,且两个匹配器的路径除此之外相同,则没有*的匹配器会被认为更具体并排在前面。

      例如:

      • /foobar/foo更具体
      • /foo/foo*更具体
      • /foo/*/foo*更具体
    • 带有任何其他匹配器的指令排在后面,按它们在Caddyfile中出现的顺序排序。

      这包括带有多个值的路径匹配器,以及命名匹配器

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

  • vars指令按匹配器排序的顺序相反,因为它会设置可能相互覆盖的值,所以最具体的匹配器应最后评估。

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