flask请求头超限典型报错是400 bad request并提示“request header or cookie too large”,因werkzeug默认限制16kb,nginx默认仅支持4kb×4缓冲区,需同步调整werkzeug的max_header_length和nginx的large_client_header_buffers等配置。

Flask请求头超限的典型报错是什么
Werkzeug默认限制请求头总大小为16KB,超过会直接返回 400 Bad Request,错误信息通常是 Request Header Or Cookie Too Large。这个限制在开发时不易察觉,但上线后遇到带长 Authorization、Cookie 或自定义多级 X-Forwarded- 头的请求就会触发。
常见场景包括:JWT Token过长(尤其含大量claims)、SAML断言嵌入Header、微服务间透传多层代理头。
如何改Werkzeug的请求头大小限制
Werkzeug 2.2+ 版本通过 MAX_HEADER_LENGTH 配置项控制,需在创建 WSGIServer 实例或调用 run() 时传入:
- 若用
app.run()启动(仅开发):app.run(max_header_length=65536)
- 若用
werkzeug.serving.make_server()(推荐用于测试/轻量部署):make_server(..., max_header_length=65536)
- 若用 Gunicorn/uWSGI,则此参数无效——它们不走Werkzeug内置服务器,得靠反向代理或应用层处理
注意:max_header_length 单位是字节,不是KB;设太大可能增加DoS风险,64KB(65536)是较稳妥的上限。
Nginx侧必须同步调整哪些配置
Nginx默认 large_client_header_buffers 仅支持4KB×4块,若Werkzeug放宽了但Nginx先拦下,仍会返回 400 Request Header Or Cookie Too Large。
需要在 http 或 server 块中显式加大:
-
large_client_header_buffers 4 64k;(4个缓冲区,每个64KB) -
client_header_buffer_size 8k;(初始缓冲区,建议设为最大单个header预期长度) - 可选:
client_max_body_size 0;(若同时上传大Body,但此与Header无关)
别漏掉重载:nginx -s reload,否则配置不生效。
为什么不能只调一边
Werkzeug限制在应用层解析前校验,Nginx限制在转发前拦截。两者是独立关卡,像两道安检门——前端Nginx拦下,请求根本到不了Flask;Werkzeug拦下,说明请求已穿透Nginx但被Python层拒绝。
还容易踩的坑:
- Flask本身无
MAX_HEADER_LENGTH配置,它完全依赖Werkzeug - 使用
gunicorn --limit-request-field_size时,该参数控制的是单个字段(如单个Header),不是总和,和Werkzeug的max_header_length不等价 - 如果用了Cloudflare等CDN,它们也有自己的Header长度限制,需单独查文档调整
Header长度问题往往暴露在链路最外层,排查时得从Nginx access log开始,看是哪一层先返回400。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











