nginx仅支持请求头的提取、校验、过滤、重写、透传五类操作,无法实现语义解析、签名校验或动态规则识别;深度清洗须由后端专用服务完成。

Nginx 本身不支持对请求头做“深度清洗”——它无法解析 Header 内容语义、还原被篡改的字段、校验签名或解密加密头,也不能动态调用外部规则引擎判断某个 User-Agent 是否伪装成 Chrome 实际却是 Puppeteer。所谓“请求头深度清洗”,在 Nginx 层只能做到提取、校验、过滤、重写、透传这五类操作,真正的深度行为识别必须交由后端专用清洗服务完成。
提取与标准化关键请求头
Nginx 可以用 $http_* 变量捕获原始 Header,但需注意大小写转换和空值处理:
- 用
$http_user_agent获取 UA,配合map指令归一化(如把mobile safari/605.1.15映射为ios-safari) - 用
$http_x_forwarded_for提取真实 IP,但必须校验是否来自可信代理(如只信任10.0.0.0/8网段),否则直接丢弃 - 对自定义头如
X-Device-ID或X-Signature,可用if ($http_x_device_id = "") { return 400; }强制存在性检查
校验与过滤异常请求头
不是所有 Header 都该被接受,尤其当它们违反协议规范或携带可疑模式时:
- 拒绝含控制字符(
\x00-\x1f)或超长值(如User-Agent> 512 字节)的请求,可用limit_req+ 自定义日志标记后限速或拦截 - 校验
Referer是否为空或来自黑名单域名(如evil.com、123xxx.cn),用valid_referers指令配合if返回 403 - 禁止客户端伪造
Host头指向内网地址(如Host: 127.0.0.1),可用正则匹配并return 444(关闭连接)
重写与安全增强型透传
清洗不是删除,而是让下游能更可靠地决策。Nginx 应将清洗后的上下文完整、可信地传递给后端:
- 用
proxy_set_header X-Real-IP $remote_addr;替代不可信的X-Forwarded-For - 用
proxy_set_header X-UA-Profile $ua_profile;(由map定义)传递归一化后的设备类型,而非原始 UA 字符串 - 对高风险请求,添加标记头如
X-Scrub-Level: high,让后端路由至沙箱或人工审核队列 - 移除敏感头(如
X-Internal-Token)避免泄露,用proxy_hide_header或underscores_in_headers on;配合严格命名规避
与后端清洗服务协同的关键点
Nginx 的请求头处理只是清洗链路的第一环,必须确保它不破坏后续分析所需的上下文:
- 所有用于清洗决策的原始 Header(如
User-Agent、Accept-Language、Sec-Ch-Ua)必须原样透传,不能提前截断或 base64 编码 - 若后端依赖 TLS 特征(如 ALPN 协议、SNI 域名),需开启
proxy_ssl_server_name on;并透传X-TLS-Sni - 对需要会话关联的清洗(如滑动窗口计数),建议用
ip_hash或sticky cookie保证同一 IP 或设备始终打到同一清洗节点











