Caddy 自动 HTTPS 与请求限制
给小站配 HTTPS,Nginx 要自己申请证书、写续期任务、配跳转。Caddy 把这些全部内置了,站点用的这份 Caddyfile 全文二十行出头。
证书和跳转
{$DOMAIN} {
reverse_proxy app:4321
}
域名从环境变量注入,Caddy 启动后自动向 Let’s Encrypt 申请证书并负责续期。前提是 80 和 443 端口开放、域名已解析到这台机器,验证失败会直接报 ACME 错误,日志里能看到原因。
HTTP 到 HTTPS 的跳转单独写一个站点块。
http://{$DOMAIN} {
redir https://{host}{uri} permanent
}
全局选项里还关了 auto_https disable_redirects 对应的自动跳转行为,改为显式控制。自动跳转在多数场景没问题,但证书还没签下来的头几分钟里,显式的块行为更可预测。
安全头和请求体限制
header {
X-Content-Type-Options nosniff
Referrer-Policy strict-origin-when-cross-origin
X-Frame-Options DENY
-Server
}
request_body {
max_size 2MB
}
encode zstd gzip
-Server 表示删掉响应里的 Server 头,少暴露一层实现信息。X-Frame-Options DENY 防止站点被嵌进别人的 iframe,对一个有登录表单的站点来说是必要的。
请求体限制 2MB 针对的是认证、兑换、购买这类表单接口。应用层自己也会做校验,代理层先把超大请求挡掉,恶意的大载荷到不了应用。两层检查的职责不一样,代理管流量形状,应用管业务语义。
和应用的边界
Caddy 只做反代和流量整形,reverse_proxy app:4321 一行接完。session 校验、同源检查、权限判断全在应用层,代理层不碰。这个边界守住之后,换代理实现(比如以后迁到别的网关)不需要改业务代码。