Caddyfile
# Caddyfile to JSON
caddy adapt --config Caddyfile --adapter caddyfile --pretty
# 不支持 SIGUSR1
caddy reload -c /data/Caddyfile
- 全局
{} - snippet
(snippet) {} - Site block
example.com {} - 环境变量
{$SITE_ADDRESS}{env.HOME}
- 默认值
{$DOMAIN:localhost} - 占位/变量 -
{}- env.
- system.{hostname,slash,os,arch,wd}
- time.now, time.now.{unix,unix_ms,common_log,year}
- 存储位置
$XDG_DATA_HOME/caddy- ~/.config/caddy
- ~/.share/caddy
- Named matchers -
@name - 表达式 匹配
- placeholders
caution
- log format append 的 value 只支持 global 的 placeholder
- 因为日志是在 HTTP 请求上下文之外处理的
- 不支持 per-request placeholders
| directive | for |
|---|---|
handle [<matcgher>] | |
handle_path <path_matcher> | handle+uri_strip_prefix |
handle_errors [<status_codes...>] | |
route [<matcgher>] | 类似 handle, 但只分组不互斥, 不重排 |
@mutable `{method}.startsWith("P")`
expression {method}.startsWith("P")
example.com {
gzip
reverse_proxy / 127.0.0.1:9000 {
transport fastcgi
}
}
example.com {
root * /var/www
file_server
}
# 定义片段
(redirect) {
@http {
protocol http
}
redir @http https://{host}{uri}
}
(snippet) {
respond "Yahaha! You found {args.0}!"
}
# 引用片段
import redirect
a.example.com {
import snippet "Example A"
}
rewrite * {path}?{query}&host={host}
重写 header 到 path
abc-dev.domain.co->abc/def/{uri}
@parseHost header_regexp parsedHost Host ^([a-z0-9]+)-([a-z0-9]+)\.domain\.co$
root @parseHost /opt/serve/{re.parsedHost.2}/stages/{re.parsedHost.1}
abc.builds.wener.me->abc/{uri}http.request.host.labels从 0 开始
*.builds.wener.me {
root * /opt/serve/builds/{http.request.host.labels.3}
try_files {path} /index.html
file_server
}
matcher
*/path@name- named matcher- path
- method
- header
- EXPRESSION
- Request Matchers
- client_ip
- remote_ip
protocol http|https|grpc|http/<version>[+]- method
- host
- path
- path_regexp
- header
- header_regexp
query <key>=<val>- not
- vars
- vargs_regexp
- expression
- 参考
@postfoo {
method POST
path /foo/*
}
多个路径
@api {
path /api
path /api/*
path /graphql
path /graphql/*
}
reverse_proxy @api http://server:3000
reverse_proxy http://console:3000