Nginx报400错误“request header or cookie too large”是因请求头超限被拦截,需调大client_header_buffer_size(如32k)和large_client_header_buffers(如4 64k)。

为什么 Nginx 报 400 错误且日志里有 “request header or cookie too large”
这是典型的请求头超限触发的拦截,不是 ThinkPHP 本身的问题,而是 Web 服务器(Nginx/Apache)默认缓冲区太小,尤其在启用 JWT、长 Cookie、多层代理或调试工具注入大量 Header 时极易触发。
-
client_header_buffer_size控制单行 header 的最大长度,默认通常只有 1k,遇到带长 Token 的Authorization头直接截断 -
large_client_header_buffers控制整个 header 块的总容量,默认 4×8k = 32k,但 ThinkPHP 的think-swoole或某些中间件可能拼接出超长X-Forwarded-For或自定义追踪头 - 若用了 CDN 或反向代理(如 Cloudflare),它可能往请求里加一堆
cf-*头,进一步挤占空间
Nginx 配置中必须改哪两个参数
只改这两个,别碰 client_max_body_size(那是 POST body 限制,和 header 无关):
- 把
client_header_buffer_size提到16k或32k,避免单行 header 被切碎 - 把
large_client_header_buffers改成4 64k(即最多 4 个 buffer,每个 64k),总容量 256k 足够应付多数 JWT + 多级代理场景 - 修改位置必须在
http或对应server块内,不能只写在location里——header 解析发生在 location 匹配前
http {
client_header_buffer_size 32k;
large_client_header_buffers 4 64k;
# 其他配置...
}
Apache 用户怎么调 LimitRequestFieldSize
Apache 默认 LimitRequestFieldSize 是 8190 字节,比 Nginx 更容易撞墙,尤其在开启 mod_rewrite 或用 .htaccess 注入 header 时:
- 该指令只能出现在
server config或virtual host级,.htaccess里无效 - 建议设为
32768(32k),同时检查LimitRequestFields(默认 100 个字段)是否够用,ThinkPHP 日志中间件有时会塞一堆X-Debug-* - 改完必须
apachectl configtest && apachectl graceful,漏掉重载会导致配置不生效
ThinkPHP 自身有没有 header 相关埋点要关
框架本身不主动发大 header,但某些扩展或调试配置会悄悄加料:
- 关闭
app_debug = true时,ThinkPHP 会在响应头里加X-Powered-By和X-ThinkPHP,虽不影响请求,但说明你正在开发环境裸跑——此时更可能开着 Fiddler/Charles,它们会往请求头里塞调试字段 - 检查中间件里有没有手动
$request->header()拼接逻辑,比如把 session_id、用户角色、权限树全塞进一个自定义 header 传给前端 -
think-swoole的http_compression开启时,某些版本会对 header 做预处理,升级到 v4.1.10+ 可规避部分解析异常
真正卡住你的,往往不是 ThinkPHP,而是你没意识到 Nginx/Apache 在你转发请求前就默默丢掉了它。buffer 不够,再短的 URL 也进不来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











