ignore_invalid_headers仅控制非法请求头的处理方式:on时丢弃头但放行请求,off时直接返回400错误;它不拦截请求本身,也不能替代WAF或map+if等主动校验机制。

ignore_invalid_headers 不能真正“过滤”非法请求头,它只控制 Nginx 遇到非法头时是跳过还是拒接请求。
它实际起什么作用
该指令决定 Nginx 如何响应格式不合规的请求头(如含下划线_、空格、控制字符、以数字开头等):
-
on(默认):发现非法头后直接丢弃,不传给后端或变量(如
$http_x_user_id为空),但请求仍正常处理 -
off:只要检测到一个非法头,立即返回
400 Bad Request,且不进入 location 匹配、不转发 upstream
必须在 http 块中配置
ignore_invalid_headers 只能在 http{} 或 server{} 块中使用,不能写在 location 内。否则 Nginx 启动会报错:
- 正确位置示例:
http {<br> ignore_invalid_headers off;<br> server { ... }<br>} - 错误写法:
location / { ignore_invalid_headers off; }→ 语法错误
常见非法头触发场景
以下情况容易触发 ignore_invalid_headers 生效:
- 客户端 SDK 或测试工具用下划线命名自定义头,如
X-User_Id(RFC 要求只能用字母、数字、短横线) - 前端 fetch 设置了含空格或 Unicode 符号的 header 名
- 上游 CDN/WAF 未清理透传的畸形头,如
Host: example.com\r\nX-Foo: - 恶意扫描器发送含控制字符(
\r、\n、\x00)的 header
真正拦截非法头要靠其他方式
若需主动拒绝含非法字符的请求,不能依赖 ignore_invalid_headers,而应组合使用:
- 用
map + if + return 400校验 header 名是否含下划线或控制符 - 开启
underscores_in_headers on允许下划线(仅当业务强依赖且信任客户端时) - 搭配 WAF(如 ModSecurity)或 OpenResty 做正则级头字段校验
- 日志中开启
error_log ... info级别,可捕获类似client sent invalid header line: "X-Bad_Header: value"的记录,用于定位问题来源










