ignore_invalid_headers不能增强畸形报文过滤安全,它仅控制是否丢弃含非法字符的请求头字段,不拦截请求、不返回错误,也非安全机制;设为on时丢弃非法头,off时保留并尝试解析;其设计初衷是CGI兼容性而非安全防护,真正防御需结合map校验、长度限制、WAF及白名单等组合方案。

ignore_invalid_headers 不能增强畸形报文过滤安全,它只是控制是否丢弃含非法字符(如下划线、控制符、空格等)的请求头字段,不拦截请求,也不返回错误,更不是安全机制。
它实际只做两件事
• 设为 on(默认):遇到含下划线(如 My_Header)、不可见字符或非标准分隔符的请求头,直接丢弃,后续无法通过 $http_my_header 访问该值;
• 设为 off:保留并尝试解析这类头,可能映射为变量供 rewrite 或日志使用。
为什么不能靠它防攻击
• 请求仍会完整进入 location 匹配、proxy_pass、PHP-FPM 等后端处理流程;
• 对恶意内容(如 X-Forwarded-For: <script></script>、CRLF 注入、超长 header、编码混淆)完全无感知;
• 下划线被限制主因是 CGI 兼容性(防止 HTTP_PROXY 变量污染),而非安全设计。
真正要拦截畸形报文,得用组合方案
• 用 map + if 对关键 header 做正则校验,匹配即 return 400:
map $http_user_agent $bad_ua { ~*[[:cntrl:]\s] 1; default 0; }
if ($bad_ua) { return 400; }
• 限制 header 总长度和单个字段长度(large_client_header_buffers、client_header_buffer_size);
• 配合 WAF 或自定义模块检测 CRLF、编码绕过、非法字符集等深层畸形;
• 对敏感头(如 Host、Referer、Origin)做白名单校验,拒绝非预期值。

















