nginx过滤非法请求头核心是覆盖、阻断或拒绝:用proxy_set_header ""清空高危头(如authorization、cookie、x-forwarded-for);用if+return拦截含恶意值的头;ignore_invalid_headers控制非法头名处理(on静默丢弃,off触发400);第三方http-guard模块可正则匹配拦截。

在 Nginx 的 server 块中过滤并清理非法请求头,核心不是“删除”,而是**覆盖、阻断透传、或主动拒绝**。Nginx 本身不支持真正删除客户端请求头,但可通过明确指令控制其是否生效、是否透传、是否触发拦截。
用 proxy_set_header 清空高危请求头
当 Nginx 作反向代理时,最常用且有效的方式是用 proxy_set_header 将敏感头设为空字符串,切断透传链路:
-
proxy_set_header Authorization "";—— 阻断 Token 或 Basic 凭据传递 -
proxy_set_header Cookie "";—— 防止客户端携带的会话信息污染后端 -
proxy_set_header X-Forwarded-For "";和proxy_set_header X-Real-IP "";—— 避免伪造 IP 被后端误信
⚠️ 注意:必须写成 ""(双引号包裹的空字符串),不能省略引号,也不能写成 proxy_set_header Authorization;(语法错误)。
用 if + return 拦截含非法值的请求头
对已知恶意模式(如 Pragma 强制刷新、危险 User-Agent、含脚本片段的 Referer),可在 server 或 location 中直接拦截:
- 拒绝非标 Pragma:
if ($http_pragma !~ "^$|^no-cache$") { return 403; } - 拦截扫描器 UA:
if ($http_user_agent ~* "(sqlmap|nmap|nikto|curl.*python)") { return 444; } - 禁止 Host 含端口:
if ($host ~ ":[0-9]+$") { return 400; }
这类规则需放在 proxy_pass 之前,且注意 if 在 location 中使用更安全(避免在 server 级误匹配)。
用 ignore_invalid_headers 控制非法头名处理
该指令作用于 header 字段名(如 My_Header 中的下划线),不影响值内容:
-
ignore_invalid_headers on;(默认)—— 静默丢弃非法名头(如含空格、下划线、控制字符),后续无法通过$http_my_header获取 -
ignore_invalid_headers off;—— 尝试解析并保留,但可能引发变量污染或兼容问题;生产环境慎用,仅在严格协议校验场景启用
建议统一在 http 块设置,避免遗漏。它不拦截请求,也不替代内容级过滤。
用 Http-Guard 模块做轻量级头字段匹配拦截
若已编译安装第三方模块 ngx_http_guard_module,可实现正则匹配拦截:
- 必须先开启:
guard on; - 规则写法:
guard_rule $http_referer "evil\.com|123xxx\.cn" 403; - 匹配目标必须带
$http_前缀,状态码限 403 / 444 / 503
⚠️ 注意:该模块不处理请求体或 URL 参数;拦截发生在日志记录前,所以 access.log 不会留下记录;Nginx ≥1.21 需打补丁才能兼容。











