Traefik 3.7.17(2026-10-30)换成 Go 1.27.3 编译。Go 1.27 给 HTTP 服务加了默认最多 500 个 header value 的上限,超了就回 431 Request Header Fields Too Large,而且发生在路由之前,access log 里看不到。
官方 Migration 也写了可用入口选项 maxHeaderValueCount 改这个上限。下面用 traefik:v3.7.16(Go 1.26.10)对照 v3.7.17,后端是 Spring Boot 4.1.2。
版本事实
Version: 3.7.16
Go version: go1.26.10
Built: 2026-10-20T15:11:21Z
Version: 3.7.17
Go version: go1.27.3
Built: 2026-10-30T08:24:21Z
Go 1.27 文档里对应字段是 Server.MaxHeaderValueCount,未设置时走 DefaultMaxHeaderValueCount(500)。Traefik 把它暴露成 entryPoints 的 http.maxHeaderValueCount。
3.7.16:501 个自定义头仍能进到 Boot
Boot 暴露 /api/headers,回 JSON 里的 headerValueCount。客户端用 urllib 再叠 Host / User-Agent 等,所以 Boot 看到的总数会比「自定义头个数」多几个。
===== Traefik 3.7.16 =====
+ custom_header_names=496
HTTP 200
{"ok":true,"headerValueCount":505}
+ custom_header_names=497
HTTP 200
{"ok":true,"headerValueCount":506}
+ custom_header_names=501
HTTP 200
{"ok":true,"headerValueCount":510}
在 3.7.16 上,这些请求都能转到后端,Boot 正常 200。
3.7.17:自定义头到 497 个起,网关先回 431
同一套动态路由和同一份 Boot,只换镜像标签。
===== Traefik 3.7.17 =====
+ custom_header_names=496
HTTP 200
{"ok":true,"headerValueCount":505}
+ custom_header_names=497
HTTP 431
431 Request Header Fields Too Large
+ custom_header_names=501
HTTP 431
431 Request Header Fields Too Large
496 个自定义头名仍是 200;从 497 起客户端侧总 header value 越过默认 500,Traefik 直接 431,请求到不了 Boot。Migration 提醒:这类拒绝发生在路由前,access log 不会记,只在需要时看 DEBUG。
把 maxHeaderValueCount 提到 1000 就又通了
静态配置给入口加一行:
entryPoints:
web:
address: ":8080"
http:
maxHeaderValueCount: 1000
===== Traefik 3.7.17 maxHeaderValueCount=1000 =====
+ custom_header_names=501
HTTP 200
{"ok":true,"headerValueCount":510}
501 个自定义头再次 200。网关侧默认更紧之后,多租户网关、带一长串追踪/灰度头的调用链,升级 3.7.17 时如果突然冒 431,先数 header value,再决定是收敛请求头,还是显式调高 maxHeaderValueCount。
一起交流
分享你的思考,让讨论更进一步。