nginx默认忽略带下划线的http请求头,需在http或server块中配置underscores_in_headers on启用;启用后头字段原样传递并转为小写+下划线映射变量,但存在安全风险,建议客户端优先使用rfc标准命名(如x-api-key)。

Nginx 默认会忽略带有下划线(_)的 HTTP 请求头字段,这是出于安全考虑,防止与内部变量名冲突(例如 $request_uri 和 $http_user_agent 等变量依赖头名转换)。但某些客户端或代理(如部分测试工具、旧版 SDK 或自定义服务)可能使用带下划线的 header(如 X-Api_Key、Content_Id),此时需显式启用支持。
启用 underscores_in_headers 的配置位置
该指令只能在 http 块或 server 块中设置,不能在 location 块中使用。推荐统一在 http 块中开启,确保所有 server 都生效:
- 编辑
nginx.conf,在http { ... }内添加:
underscores_in_headers on; - 若只需对特定虚拟主机启用,可在对应
server块中添加相同指令 - 注意:该指令默认为
off,且一旦设为on,Nginx 不会过滤掉含下划线的 header,而是原样传递给后端(如 FastCGI、proxy_pass)
header 名称转换规则仍适用
即使启用了 underscores_in_headers on,Nginx 解析 header 后仍会将其转为小写并用下划线替代连字符(-),用于映射到变量(如 $http_x_api_key)。但原始 header 中的下划线会被保留,不会被自动替换或丢弃:
- 请求头
X-Api_Key: abc123→ 可通过$http_x_api_key在 Nginx 中引用(注意:连字符变下划线,原有下划线保留) - 请求头
X_User_ID: test→ 对应变量为$http_x_user_id - 若同时存在
X-User-ID和X_User_ID,两者都会被接收,但仅后者能通过$http_x_user_id访问(因命名冲突,前者无法生成唯一变量名)
配合 proxy_pass 使用时的注意事项
当 Nginx 作为反向代理时,启用该选项后,带下划线的 header 会正常转发给上游服务(前提是上游服务本身支持解析这类 header):
- 确保后端应用(如 Node.js、Python Flask/FastAPI、Java Spring)未主动过滤或忽略含下划线的 header
- 某些语言运行时(如 Go 的
net/http)默认将 header 中的下划线转为连字符,需检查实际接收行为 - 可通过
add_header X-Debug-Header "$http_x_api_key";临时输出到响应头,验证是否成功接收
不建议在公网生产环境全局开启
虽然功能可用,但开启 underscores_in_headers on 可能带来潜在风险:
- 增加 header 名与 Nginx 内部变量意外匹配的可能性(如构造恶意
Content_Length干扰请求体解析) - 部分 WAF 或安全网关可能将含下划线 header 视为异常流量
- 更稳妥的做法是:让客户端改用符合 RFC 标准的 header 命名(全小写 + 连字符),例如
x-api-key替代X_Api_Key










