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。

参考来源

— 感谢阅读 —
广告

一起交流

分享你的思考,让讨论更进一步。