在 nginx 中处理包含下划线的请求头(如 x_custom_header),默认情况下会被直接丢弃。要保留并转发这些字段,必须在配置中显式设置 underscores_in_headers on;。开启后,nginx 会将原始请求头原样传递给上游服务器,无需额外转换。

如何验证下划线头是否被正常接收?
通过检查上游服务的日志或响应内容,可以确认 Nginx 是否正确转发了带下划线的请求头。只需在 Nginx 配置中添加 underscores_in_headers on;,并确保上游服务能解析该头部即可。

server {
listen 80;
server_name example.com;
underscores_in_headers on;
location /api {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
预期结果:当客户端发送 X_Custom_Header: value 时,上游服务应能接收到该头部,且值为 value。若未设置 underscores_in_headers on;,则该头部将被忽略。
为什么某些代理会拒绝带下划线的头?
部分上游代理或应用服务器出于安全考虑,默认拒绝包含下划线的 HTTP 头,以防止头部注入攻击。因此,即使 Nginx 已启用 underscores_in_headers on;,仍需确保上游服务支持此类头部。

# 示例:在 Go 语言中接收带下划线的头
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
customHeader := r.Header.Get("X-Custom-Header")
fmt.Fprintf(w, "Received: %s", customHeader)
}
func main() {
http.HandleFunc("/api", handler)
http.ListenAndServe(":8080", nil)
}
预期结果:Go 的 net/http 包默认允许接收带下划线的头,因此上游服务可正常获取 X_Custom_Header。若使用其他语言或框架,需查阅其文档确认是否支持。
如果上游服务不支持下划线头怎么办?
若上游服务无法处理带下划线的头,可在 Nginx 中使用 proxy_set_header 将下划线替换为连字符,例如将 X_Custom_Header 转换为 X-Custom-Header。这样既满足 Nginx 的转发要求,又兼容上游服务的限制。











