mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1260 字
3 分钟
Caddy 进阶配置详解:全局配置、HTTPS 跳转、访问认证与安全策略

上一篇文章介绍了 Caddy 通过 DNS Challenge 配置 Wildcard 证书,实现泛域名 HTTPS 自动申请和续签。

实际生产环境中,除了 HTTPS 证书管理,还需要进一步优化:

  • 全局参数统一管理;
  • ACME 配置统一设置;
  • 强制 HTTPS;
  • 域名访问规范化;
  • HTTP 请求处理;
  • 多站点统一管理。

这些功能主要通过 Caddyfile 的:

  • Global Options Block(全局配置块)
  • Site Block(站点配置块)

实现。

Caddyfile 配置结构#

Caddyfile 基本结构#

{
# 全局配置
}
example.com {
# 站点配置
}

全局配置块#

全局配置块可以:

  • 配置整个 Caddy 实例;
  • 对所有站点生效。

例如:

{
email admin@example.com
}

全局配置块只能存在一个。

站点配置块#

站点配置块可以:

  • 控制具体域名行为;
  • 每个站点独立配置;
  • 包含代理、静态文件、跳转等逻辑。

例如:

example.com {
reverse_proxy localhost:8000
}

全局配置块常用配置#

配置 ACME 邮箱#

申请 Let’s Encrypt 或其他 ACME 证书时使用。

  • 避免每个站点重复配置;
  • 方便证书到期提醒。
{
email admin@example.com
}

开启 Debug 模式#

开发环境中,开启此功能可以看到更详细的日志,方便排查 TLS、代理问题。

{
debug
}

生产环境通常选择关闭。

站点配置块常用配置#

静态文件代理#

example.com {
handle {
root * /var/www/html
file_server
}
}

反向代理#

example.com {
handle {
reverse_proxy 127.0.0.1:8000
}
}

请求路径分流#

Caddy 的 handle 可以实现类似 Nginx location 的路径分流功能,但匹配规则和优先级机制不同。

例如:

example.com {
handle /api/* {
reverse_proxy 127.0.0.1:8000
}
handle {
root * /var/www/html
file_server
}
}

HTTPS 与域名规范化#

强制 HTTPS#

Caddy 默认会自动 HTTPS。 例如,访问:

http://example.com

会自动跳转到:

https://example.com

这是因为 Caddy Automatic HTTPS 默认开启。

只有在特殊场景,例如:

  • 自定义跳转规则;
  • 多域名入口统一;
  • 与其他代理层配合等情况下。

才需要手动配置 redir

例如:

http://example.com {
redir https://example.com{uri} permanent
}

通常情况下无需手动配置,Caddy 会自动监听 HTTP 请求并完成 HTTPS 跳转。

强制跳转到 www#

很多网站需要统一访问入口,这样做的目的一般是:

  • SEO 权重统一;
  • Cookie 域管理;
  • 避免两个站点重复等。

例如用户访问:

https://example.com

需要统一跳转到:

https://www.example.com

配置:

example.com {
redir https://www.example.com{uri} permanent
}
www.example.com {
reverse_proxy localhost:8000
}

如果使用 www 子域名,需要确保申请证书时包含 www.example.com*.example.com

需要保证 www 子域名,已完成 DNS 解析。

www 跳转到一级域名#

与强制跳转到 www功能相反,目的都是统一网站访问入口,其配置如下:

www.example.com {
redir https://example.com{uri} permanent
}
example.com {
reverse_proxy localhost:8000
}

安全策略#

访问认证(类似 nginx auth_basic)#

Caddy 不保存明文密码。所以需要执行:

# 根据实际需求替换密码
caddy hash-password --plaintext "123456"

会得到类似:

$2a$14$xxxx

格式的 bcrypt 哈希字符串。

bcrypt 哈希字符串实际前缀和 cost 取决于 Caddy 版本。

修改 Caddyfile 文件,将账号、密码填充至想要加密访问的域名下:

admin.example.com {
basic_auth {
admin $2a$14$xxxx
}
reverse_proxy localhost:9000
}

Caddy 的 basic_auth 使用 bcrypt 哈希保存密码,不保存明文密码。

Basic Auth 必须配合 HTTPS 使用,否则用户名密码可能被截获。

安全 Header#

example.com {
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
X-Frame-Options "SAMEORIGIN"
Referrer-Policy "strict-origin-when-cross-origin"
}
}

参数说明:

Header作用
HSTS强制 HTTPS
nosniff防止 MIME 嗅探
X-Frame防止 iframe 点击劫持
Referrer控制来源信息

HSTS 建议确认所有子域名均支持 HTTPS 后开启,否则可能导致部分子域名无法访问。

响应压缩(Gzip / Zstd)#

Caddy 可以通过 encode 自动压缩响应内容。 Caddy 会根据客户端发送的 Accept-Encoding 自动选择支持的压缩算法。 常用于:

  • HTML
  • CSS
  • JavaScript
  • JSON API
example.com {
encode gzip zstd
reverse_proxy localhost:8000
}

常见问题#

全局配置块能随意放置吗?#

不可以。

  1. 全局配置块必须位于 Caddyfile 文件的最顶部。
  2. 全局配置块只能有一个。

为什么配置了 HTTPS 还需要 HTTP 重定向?#

因为用户可能输入:

example.com

用户直接输入域名时,浏览器可能首先通过 HTTP 请求访问,因此需要确保 HTTP 请求能够正确跳转 HTTPS。

明确重定向可以保证 HTTP → HTTPS 统一入口。

为什么 example.com 和 *.example.com 要同时申请?#

因为:

*.example.com

只能覆盖:

api.example.com
blog.example.com

等域名,不能覆盖:

example.com

为什么配置修改后没有生效?#

需要重载配置文件,以 docker-compose 为例,执行:

# 检查配置
docker compose exec caddy caddy validate --config /etc/caddy/Caddyfile
# 重载配置
docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile

参考资料#

  1. Caddy 官方文档:介绍 Caddy 的安装、配置、自动 HTTPS、反向代理以及模块扩展等功能。
  2. Caddy Automatic HTTPS:介绍 Caddy 自动 HTTPS、ACME 证书申请以及自动续签机制。
  3. Caddyfile 官方文档:介绍 Caddyfile 配置格式、全局配置块、站点配置以及指令使用方式。
  4. Caddyfile Directives 官方文档:介绍 reverse_proxy、handle、header、encode、redir 等请求处理指令。
  5. ACME 协议标准(RFC 8555):定义自动化申请、验证和管理 TLS 证书的标准流程。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Caddy 进阶配置详解:全局配置、HTTPS 跳转、访问认证与安全策略
https://www.pyart.cn/posts/caddy-advanced-configuration/
作者
kang
发布于
2026-07-24
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录