症状
请求以 431 Request Header Fields Too Large 失败,常只对 cookie 已增长的特定用户出现。Cookie 会随时间累积,而把大 token 存进 cookie 会把请求头块推过服务器或代理的缓冲区上限。该错误是保护性上限而非缺陷,因此修复要么缩小头部,要么谨慎提高上限。
诊断
测量请求头大小;检查 set-cookie 的累积;查看 large_client_header_buffers 等配置。
curl -v -b "$(cat cookies.txt)" https://host/ 2>&1 | grep -i "> " | wc -c
根因
请求头块超过了服务器或代理的缓冲区上限,因为 cookie 或请求头增长的尺寸超过配置的最大值。
修复
清理 cookie;把大 token 移出 cookie 改为短期引用;删除不再需要的 cookie。确需更大空间时适度提高请求头缓冲上限,因为过大的上限会增加每连接内存与滥用的影响。
验证
发送此前失败的请求确认成功,并确认受影响用户能认证与浏览。这些用户请求成功即证明头部尺寸已在上限内。
常见陷阱
为提高上限而设置极大值会放大内存与 DoS 风险;应结合减小头部尺寸处理。