Caddy 常用功能配置文件模板

作者:Ake 发布于:2025年3月16日

通常使用 Caddyfile 对 Caddy 进行配置。该文件位于/etc/caddy/Caddyfile

文件托管

example.com {
    root * /var/www/html
    file_server
    # 可选:启用gzip压缩
    encode gzip
}

托管单页面应用文件时记得加上try_files,不然前端会报错:

example.com {
    root * /var/www/spa
    file_server {
        try_files {path} {path}/ /index.html
    }
}

反向代理

app.example.com {
    reverse_proxy localhost:3000
}

通常反向代理时,需要将一些信息添加到请求头中,或者重写请求头部分字段,这时可以使用header_up实现,如:

app.example.com {
    reverse_proxy localhost:3000 {
        header_up Host {host}
        header_up X-Real-IP {remote}
    }
}

或者可能需要重写请求路径,比如去掉/api前缀,这时可以使用rewrite实现,如:

app.example.com {
    # {path:1}表示捕获第一个通配符后的内容(即去掉/api后的路径)
    rewrite /api/* /{path:1}
    reverse_proxy localhost:3000 {
        header_up Host {host}
        header_up X-Real-IP {remote}
    }
}

针对这种去除前缀的场景,还有一种更直观的写法,使用strip_prefix指令,如:

app.example.com {
    route /api/* {
        uri strip_prefix /api
        reverse_proxy localhost:3000 {
            header_up Host {host}
            header_up X-Real-IP {remote}
        }
    }
}

结合实现

当然,有些情况下可能需要将/api开头的请求转发到后端服务,而其他请求直接返回静态文件,这时可以使用route块分别处理实现,如:

example.com {
    # Caddy按route块的定义顺序匹配请求。将/api/*的路由放在前面,可以确保它优先于静态文件路由被处理
    route /api/* {
        uri strip_prefix /api
        reverse_proxy localhost:3000 {
            header_up Host {host}
            header_up X-Real-IP {remote}
        }
    }

    # route块不指定路径时,默认匹配所有未命中其他路由的请求
    route {
        root * /var/www/html
        file_server
        encode gzip
    }
}

配置完成后重启 Caddy 以使配置生效:

sudo systemctl reload caddy

相关文章

Caddy 安装教程