nginx需在http或server块中配置underscores_in_headers on以支持下划线请求头,该指令不适用于location块,启用后头字段原样转发并按小写+下划线映射变量,但存在安全风险,建议客户端优先使用rfc标准命名。

直接在 Nginx 的 http 块或 server 块中添加 underscores_in_headers on; 即可启用对含下划线 HTTP 请求头的支持。这是唯一有效的配置方式,且必须重载 Nginx 才会生效。
配置位置与作用范围
该指令只能出现在 http 或 server 上下文中,不能写在 location 块内:
- 全局启用:加在
http { }块最外层,所有 server 都继承(推荐用于统一管理) - 按需启用:加在特定
server { }块内,仅对该虚拟主机生效 - 不支持嵌套继承:子 server 不会自动继承父 http 块的设置,除非显式声明或放在 http 块顶层
配置后 header 的行为变化
开启后,Nginx 不再丢弃带下划线的请求头,但仍有两项关键规则:
- 原始 header 名称被保留并原样转发给后端(如
X_API_KEY仍以该形式发往 upstream) - Nginx 内部变量映射仍按小写 + 下划线转换:例如
X-API-KEY→$http_x_api_key,而X_API_KEY同样映射为$http_x_api_key - 若同时存在
X-Api-Key和X_Api_Key,两者都可达,但仅后者能通过$http_x_api_key变量读取(前者因连字符转义规则不同,变量名冲突)
配合 proxy_pass 使用的关键点
作为反向代理时,仅开启 underscores_in_headers 还不够,还需确保下游服务能正确接收:
- 用
proxy_set_header显式转发:例如proxy_set_header X-API-KEY $http_x_api_key;(注意变量名是转换后的格式) - 验证是否生效:临时加一行
add_header X-Debug "$http_x_api_key";,查看响应头输出 - 检查后端兼容性:Go 的
net/http默认把下划线转成短横线;Node.js、Python 多数框架可原生接收,但需确认中间件未过滤
安全与生产建议
这个选项虽实用,但不应无条件开启:
- 公网入口层尽量避免启用,防止恶意构造 header(如
Content_Length干扰解析) - 优先推动客户端改用 RFC 标准命名(如
X-Api-Key替代X_Api_Key) - 若使用 K8s Ingress 或云厂商 LB,需确认其底层 Nginx 版本 ≥1.11.5 且已开放该指令配置权限











