Caddy 2.11.7:修掉 2.11.6 默认超时引发的 panic 与流截断,新增 Incremental 头
Caddy 2.11.7(10 月 3 日)是补丁版本,修 2.11.6 引入的回归——HTTP/2 代理崩溃、流在一分钟后被切断——同时加入对 Incremental 头字段(RFC 10036)的支持。还在 2.11.6 上的建议升级。
2.11.6 的默认 idle 超时暴露了三个问题
2.11.6 为了缓解慢速攻击引入了默认 idle 读/写超时,具体触发场景里出了三种问题。
HTTP/2 上请求体读完、handler 已返回后 panic(#8101)
2.11.6 里请求体的 idle deadline 生命周期可以比设置它的 handler 更长。HTTP/2 下 reverse proxy 在 handler 返回之后仍在读请求体,触发 nil pointer dereference 崩溃。#8107 把请求体 deadline 的所有权在 handler 返回时结束。
HTTP/1.1 上带 body 的流式响应在读完 body 后 60 秒被截断(#8103)
当流式响应对应一个带请求体的请求,典型是客户端用 POST 打开的 SSE 流,请求体读完后正好 60 秒,连接被切断。同样是 #8107 修复。
HTTP/2 上写入间隔超过 write_idle 的静默 SSE 被 stream error 重置(#8118、#8119)
流式响应在两次写入之间停顿超过 write_idle(默认 1 分钟),比如安静的 SSE 流,会被 stream error 重置。按文档,只有真正发生写入停滞才应该计时,正常“暂时没数据可发”不应该触发。#8119 修正了 idle writer 在两次写之间终止 h2 response writer 的行为。
缺失的 cookie / tls 占位符恢复为空串(#8019)
从 2.11.6 起,像 respond 的 header 这种把未知占位符按原样保留的位置,在请求里没有对应 cookie 时会字面输出 {http.request.cookie.*}。普通 HTTP 请求上的 {http.request.tls.*} 也一样。2.11.7 中两者重新回退为空串。
Incremental 头(RFC 10036)
这是 NGINX 专有 X-Accel-Buffering 的标准替代。上游响应带 Incremental: ?1 时:
HTTP/1.1 200 OK
Content-Type: text/event-stream
Incremental: ?1
reverse_proxy立即转发,效果等同flush_interval -1;encode直接流式输出,不再压着。
Mercure、SSE 以及其他流式应用可以直接用这个头表达“不要缓冲”。
如果配置了 request_buffers 或 response_buffers 会阻止增量转发,Caddy 按 RFC 要求返回 501 Not Implemented,而不是悄悄缓冲。新增的 proxy_status_name 选项会给这类响应加上 Proxy-Status 头,说明消息为什么被拒绝。
2.11.6 里其他需要知道的变化
- 慢速攻击缓解:新增的 idle 读写超时在每次成功读或写后重置;卡住的连接被切断,仍在推进的慢连接不受影响。可选最小传输速率,并新增
timeoutshandler 指令做按路由调优(#7913)。 - 新
url_pattern请求匹配器:按 URLPattern 标准匹配,语法与浏览器(JS)和很多框架一致;支持命名组、通配符和 regexp 分量;捕获的组变成占位符{http.url_pattern..},另有url_patternCEL 函数(#7787)。 - 新全局选项
tls_automate_names:管理证书,但不需要在 site block 里提供服务(#8015)。 - 新 server 选项
expected_underscore_headers:2.11.4 丢弃带下划线的头字段如果影响了应用,可以列出要保留的具体头(#7809)。 - 安全:同一路由同时使用
forward_auth和reverse_proxy时,请求可能被发到错误的 upstream 连接(GHSA-6365-7ppr-5r92、#7859);上游的 hop-by-hop 头在101 Switching Protocols响应里也会被剥离。 handle_path和uri的strip_prefix/strip_suffix现在会规范化结果路径,避免绕过基于路径的鉴权。path_regexp匹配器规范化 Windows 反斜杠,补完 CVE-2026-52844 的修复(#7858)。- 其余安全项:header-alias filter 扩展到
.,防止在 PHP/FastCGI 后端场景下绕过forward_auth的copy_headers;fastcgi 不再把客户端的Proxy头当作HTTP_PROXY传给后端(HTTPoxy,#7934);reverseproxy 的 sticky session cookie 哈希改为常量时间比较(#7853);admin 远程访问检查里请求路径做规范化,origin/host allow-list 大小写不敏感(#7910、#7973、#7993)。
升级判断
- 在 2.11.6 上:升级到 2.11.7。panic 和流被截断都是这次发布引入的回归,补丁版本直接覆盖。
- SSE / Mercure 场景:检查是否有用 POST 打开的流(对应 #8103);检查
write_idle是否短于流的实际写入间隔;长时间静默的流确认flush_interval的取值。升级后仍有上游侧缓冲问题的话,让上游返回Incremental: ?1。 - 从 nginx 迁移:把上游的
X-Accel-Buffering: no换成标准的Incremental: ?1,reverse_proxy与encode都会按增量方式处理。 - 同一路由里同时有
forward_auth和reverse_proxy:升级到 2.11.7,避免请求落到错误的 upstream 连接(GHSA-6365-7ppr-5r92)。 - 用
handle_path/uri的strip_prefix、strip_suffix做路径前缀再交给鉴权:升级,让结果路径先规范化。 - 2.11.4 之后被下划线头影响过的应用:用
expected_underscore_headers把要保留的头列出来。