在Iris中获取自定义Header应使用c.Header("X-Request-ID")或c.GetHeader("X-Request-ID"),注意Nginx过滤下划线、OPTIONS预检不带业务Header需显式配置CORS AllowedHeaders,并用curl或Wireshark验证原始请求。

如何在Iris中获取自定义Header值
直接用 c.Header("X-Request-ID") 或 c.GetHeader("X-Request-ID") 即可,但要注意大小写和空格处理。Iris底层基于net/http,Header键名会被自动规范化为“首字母大写、连字符后大写”格式(如 X-Request-Id),所以传入 X-Request-ID 也能命中,但不建议依赖这种自动转换。
为什么c.Header()有时返回空字符串
常见原因有三个:
- 客户端根本没发该Header(检查curl或前端代码是否带了
-H "X-Trace-Token: abc") - 反向代理(如Nginx)默认过滤掉下划线开头或含下划线的Header,比如
X_API_VERSION可能被静默丢弃;改用短横线风格(X-Api-Version)更稳妥 - 调用时机不对——必须在请求生命周期内读取,不能在中间件之后、路由处理之前就提前调用并缓存,因为Header是只读快照,但Iris的
c.Header()每次都查原始map,这点倒不用担心
读取多个同名Header或带前缀的Header
Iris没有内置批量匹配方法,需手动遍历。例如要找所有 X-Forwarded- 开头的Header:
for k := range c.Request().Header {
if strings.HasPrefix(strings.ToLower(k), "x-forwarded-") {
values := c.Request().Header[k]
// values 是 []string,注意可能有多个值
}
}
注意:c.Request().Header 返回的是原始 http.Header,key为原始大小写(未标准化),所以要用 strings.ToLower() 统一判断;而 c.Header(k) 内部会做标准化,仅适合单个已知key的场景。
自定义Header在OPTIONS预检时拿不到
这是CORS典型问题:浏览器发OPTIONS预检请求时,不会携带业务Header(如 X-User-ID)。必须在服务端显式声明允许:
app.Use(iris.CORS(
iris.CORSAllowedHeaders([]string{"X-User-ID", "X-Trace-Token"}),
))
否则即使客户端加了Header,实际请求也会被浏览器拦截,后端根本收不到。另外,AllowedHeaders 中的字符串必须和客户端发送的Header名完全一致(大小写敏感),Iris不会帮你做标准化匹配。
Header读取本身很简单,真正容易卡住的是Nginx转发规则、CORS配置、以及客户端是否真的发出了那个Header——建议先用 curl -v 或Wireshark确认原始请求里有没有,再查服务端逻辑。











