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 校验、同源检查、权限判断全在应用层,代理层不碰。这个边界守住之后,换代理实现(比如以后迁到别的网关)不需要改业务代码。