静态部署最有用的属性是:运维人员不用读应用代码,就能回答"这条响应是哪个目录提供的?"。Caddy 的 root 与 file_server 指令直接提供了这个边界。

完整目录先核验,再设为 Caddy 根目录;新目录通过冒烟测试前保留旧的已知良好目录。虚线发布树包含 HTML、文本与资源。指向树外的符号链接可能暴露服务用户可读取的目标。私有文件留在树外;边缘检查独立核验状态码、内容类型、重定向、证书名称与缺失路由行为。
明确提供响应的目录。检查符号链接及读取和目录穿越权限,再验证边缘的真实响应。

让根目录明确

一个最小的站点块可以贴近制品布局:

www.example.test {
    root * /srv/example-site
    encode zstd gzip

    header {
        -Server
        X-Content-Type-Options nosniff
        X-Frame-Options DENY
        Referrer-Policy strict-origin-when-cross-origin
    }

    file_server
}

主机名与路径都是占位值;www.example.test 不是可签发公开可信证书的生产名称。生产环境应使用自己控制且可解析的主机名,测试环境的本地 TLS 信任则另行安排。发布命令应发布一个完整目录、核验它,然后才把这个目录设为配置里的根。在新目录通过冒烟测试之前,保留旧的已知良好目录。

检查边缘,而不只是文件树

请求一个 HTML 页面、一个可下载的文本文件和一个缺失路径。把内容类型与状态码与本地制品比较。即使 404 页看起来很精致,若返回 200 仍是部署缺陷。

当 Caddy 管理 HTTPS 时,证书签发与 HTTP 到 HTTPS 的重定向都属于边缘行为。请从裸的 HTTP 监听器测试重定向,并从公共主机名读取证书名称。不要只凭进程健康就推断成功。

根目录是发布边界,不是沙箱

把版本控制元数据、备份、凭据与私有配置留在发布树之外。Caddy 会跟随根目录中的符号链接,因此链接可能暴露根目录外的文件。既要检查制品内容,也要检查服务用户的读取与目录穿越权限。此外,仅把 404.html 放进目录并不会配置自定义错误处理;应核验缺失路由的状态码与预期错误页行为。

来源