Nginx超长请求头触发400错误时,需调整large_client_header_buffers(默认4 8k),配合client_header_buffer_size等配置,兼顾安全与兼容性,避免盲目增大。

当Nginx收到超长请求头(比如特别长的URL、大量Cookie或自定义Header)时,若超出默认限制,会直接返回 400 Bad Request。关键配置项是 large_client_header_buffers,它专门控制HTTP请求头的缓冲区大小和数量。
large_client_header_buffers 的作用与默认值
该指令定义Nginx为每个客户端请求头分配的缓冲区:多少个、每个多大。语法为:large_client_header_buffers number size;
默认值通常是:large_client_header_buffers 4 8k;
即最多分配4个缓冲区,每个8KB。所有缓冲区总容量上限为32KB,但注意:第一个缓冲区(由 client_header_buffer_size 指定,默认1k)用于常规请求头;一旦不够,Nginx才启用 large_client_header_buffers 中的缓冲区来“接力”存储剩余部分。
如果整个请求头(含URL、Host、User-Agent、Cookie等)超过所有可用缓冲区总和,Nginx就拒绝请求并记录:client sent too long header while reading client request line
如何判断是否需要调大?
出现以下情况时,大概率需调整:
- 用户访问带超长查询参数的URL(如地图服务、调试接口、生成式链接)返回400
- Nginx错误日志中反复出现
too long header或request line too large - 后端应用本身支持长URL(如某些API网关、前端路由SSR),但Nginx提前拦截了
安全与实用的调整建议
盲目增大有风险,应结合实际场景平衡安全与兼容性:
- 先确认真实需求:用
curl -v "http://example.com/?$(printf 'a%.0s' {1..10000})"模拟长URL测试当前阈值 - 一般建议从
large_client_header_buffers 4 16k;开始尝试,总容量64KB已覆盖绝大多数合法长URL场景 - 避免设为
large_client_header_buffers 1 128k;这类单大缓冲——Nginx对单个缓冲区有硬性限制(通常不超过64K),且不利于内存管理 - 同步检查
client_header_buffer_size(默认1k),若多数请求头略超1k但远小于8k,可先调高此项,比动用large buffers更轻量 - 生产环境不建议无限制放大,防止恶意构造超长Header引发DoS
配合其他相关配置使用
仅调 large_client_header_buffers 可能不够,还需留意:
-
client_max_body_size:控制请求体(POST数据),与请求头无关,勿混淆 -
client_header_timeout:防止慢速Header攻击,建议保持默认或设为10–30秒 -
underscores_in_headers on;:若URL或Header含下划线(如api_key=xxx),需开启,否则直接400(与长度无关,但常被一并排查)

















