跳到正文

变量

Caddyfile 支持两种占位符,注意区别:

语法 含义
{http.request.uri} Caddyfile 占位符——在 Caddyfile 阶段就替换
{$ENV_VAR} 环境变量——由 shell / systemd 注入
{env.ENV_VAR} 显式环境变量占位符
{$DOMAIN} {
reverse_proxy localhost:9000
}

环境变量带默认值:

api.example.com {
reverse_proxy {$API_BACKEND:localhost:8080}
}
{http.request.uri} 完整路径,含query
{http.request.uri.path} 仅路径
{http.request.uri.query} query string
{http.request.method} GET / POST
{http.request.host} Host 头
{http.request.header.X-Token} 指定头
{http.request.body} 请求体(需要 request_body 指令开启)
{http.request.remote.ip} 客户端 IP
{http.request.scheme} http / https
{http.error.status_code} 错误状态码
{http.error.status_text} 状态文本
{http.error.message} 错误详情
{http.response.header.*} 响应头
{http.response.upstream_latency} 上游耗时
{http.response.duration} 总处理耗时
{host} 当前站点块地址
{env.PATH} 环境变量
{time.now.year} 当前年
{time.now.unix} Unix 时间戳
{file.<path>} 文件内容(需开启 file 插件)
example.com {
@www host www.example.com
redir @www https://example.com{uri} 301
}

这里 @www 定义了匹配器,redir 接受匹配器作为第一个参数——所以不会把所有请求都跳走。

实战:把上游耗时暴露成头

章节「实战:把上游耗时暴露成头」
reverse_proxy localhost:3000 {
header_up X-Upstream-Latency {http.response.upstream_latency}
}

反代时透传客户端信息

章节「反代时透传客户端信息」
reverse_proxy localhost:3000 {
header_up Host {host}
header_up X-Real-IP {http.request.remote.ip}
header_up X-Forwarded-Proto {http.request.scheme}
}

Caddy 默认已经会设置 X-Forwarded-For / X-Forwarded-Proto / X-Forwarded-Host,一般不用手动写。只有当你有嵌套代理(Caddy 前面还有一层 Nginx/Cloudflare)时才需要特别处理。

终端窗口
# systemd 注入
sudo systemctl edit caddy
[Service]
Environment="DOMAIN=example.com"
Environment="API_BACKEND=localhost:8080"
EnvironmentFile=/etc/caddy/caddy.env

改完 sudo systemctl restart caddy(环境变量变更需要重启,reload 不够)。