431 是什么
431 Request Header Fields Too Large 表示请求头的总大小或单个字段超出了服务端的限制。最常见的诱因是 Cookie 越攒越多——浏览器会把某域名下的所有 Cookie 都带上,一路叠加很容易顶到上限;其次是过大的令牌、超长的自定义头,以及被中间层拼进去的一长串转发地址。规范定义在 RFC 6585 第 5 节。
基本信息
| 状态码 | 431 Request Header Fields Too Large |
|---|---|
| 语义 | 请求头字段过大或字段数过多 |
| 规范 | RFC 6585 §5 |
| 常见触发 | Cookie 累积、令牌过长、转发地址链过长 |
| 与 414 的区别 | 414 指请求地址过长,431 指请求头过大 |
| 修复方向 | 精简请求头或调整服务端缓冲上限 |
各层限制项
| 组件 | 配置项 | 说明 |
|---|---|---|
| Nginx | large_client_header_buffers | 默认 4 8k,单头与总大小都受限 |
| Apache | LimitRequestFieldSize、LimitRequestFields | 分别限制单字段大小与字段数量 |
| Tomcat | maxHttpHeaderSize、maxHeaderCount | 默认约 8k,超限直接拒绝 |
| 浏览器 | 单条 Cookie 约 4k,每域名条数有限 | 累积后总长度远超预期 |
| HTTP/2 服务端 | MAX_HEADER_LIST_SIZE 协商值 | 超限表现为重置流而非返回 431 |
复现与调整
复现与调整
curl -si https://www.example.com/ -H "X-Big: $(head -c 20000 /dev/zero | tr '\0' 'a')" | head -3
# HTTP/1.1 431 Request Header Fields Too Large
nginx -T | grep -i large_client_header_buffers # 查看当前生效值
# Nginx 调整示例(放在 http 或 server 段)
# large_client_header_buffers 4 16k;典型使用场景
- 偶发 431 排查:确认是 Cookie 累积导致,还是某次请求带了异常大的自定义头
- 单点登录改造:把令牌从头里精简,或按域拆分,避免所有 Cookie 都发到所有子域
- 网关扩容后的回归:确认反向代理与后端框架两层的上限都一致
- 压测与自动化:脚本里拼接超长头触发上限,验证限流与错误处理路径
- HTTP/2 场景确认:观察是否表现为流被重置,而不是收到 431
只在网关放宽上限、后端框架仍保持默认值,症状就是间歇性 431:请求量小或头不成规律时看不出来,一旦 Cookie 增长到某个长度就稳定失败。排查时应把链路上每一层——代理、应用服务器、框架——的实际上限都查一遍。