ignore_invalid_headers 不是流量过滤机制,仅控制nginx对非法请求头的处理方式,不拦截请求、不识别恶意内容;真正防护需用map+if校验、限制高危header、waf深度检测及host/user-agent/方法校验等组合策略。

不能在 server 块中“配置忽略无效请求头来过滤恶意网络流量”——这个目标本身存在根本性误解。
ignore_invalid_headers 不是流量过滤机制
该指令只控制 Nginx 如何处理格式不合规的请求头(比如含下划线 _、空格、控制字符的 header 名),它:
-
不拦截请求:无论设为
on还是off,请求都会继续进入后续流程(location 匹配、proxy_pass 等) -
不返回错误:设为
on(默认)时只是丢弃非法头,off时才返回 400,但仅因头名格式问题,与“恶意流量”无直接关联 -
不识别内容风险:它不管
X-Forwarded-For: 127.0.0.1是否伪造,也不拦User-Agent: sqlmap这类明显恶意标识
真正能拦截恶意请求头的方式
若想基于请求头主动拒绝可疑请求,需组合使用以下方法:
- 用
map提取并校验 header 名或值,例如检测下划线、空格、控制符:map $http_x_custom_header $bad_header {<br> ~[_\s\x00-\x1f] 1;<br> default 0;<br>} - 在
server或location中用if判断并拒绝:if ($bad_header) { return 400; } - 限制高危 header 出现(如禁止
X-Forwarded-For多次出现或含非法 IP) - 搭配 WAF 模块(如 ModSecurity)做正则级深度校验,而非依赖 Nginx 原生命令
Server 块里该做的实际防护动作
与其纠结无效头,不如在 server 块中落实这几项真正有效的拦截:
- 强制校验
Host头是否匹配合法域名:if ($host !~ ^(api\.example\.com|app\.example\.com)$) { return 444; } - 拦截已知恶意
User-Agent或扫描器特征:if ($http_user_agent ~* (sqlmap|nikto|dirbuster)) { return 403; } - 限制非标准 HTTP 方法:
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS|PATCH)$) { return 405; } - 启用
default_server兜底,让所有未声明的 Host 或协议异常请求第一时间断连(返回 444)
关于 ignore_invalid_headers 的正确用法
它只应在 http 块中设置(不是 server),且目的很窄:
- 设为
off可暴露客户端或中间件(如 CDN)透传非法头的问题,配合error_log info定位来源 - 设为
on(默认)适合生产环境,避免因个别 SDK 发送X-User_Id导致大量 400 - 若业务强依赖下划线命名,可加
underscores_in_headers on;,但需确认后端无 CGI 变量污染风险











