ctx.getheader() 安全读取所有请求头,大小写不敏感但建议首字母大写;它比 ctx.request().header.get() 更稳定,避免中间件修改导致的不一致;空值返回""需判空;高频头有快捷方法如ctx.host()、ctx.remoteaddr()等,依赖withhostproxyheaders配置生效。

直接用 ctx.GetHeader() 拿原始请求头
所有标准和自定义请求头,都通过 ctx.GetHeader("X-Forwarded-For")、ctx.GetHeader("Authorization") 这类方式读取。注意大小写不敏感,但传入字符串建议按惯例首字母大写(如 "Content-Type"),避免部分代理或客户端行为不一致。
常见误操作:
- 把
ctx.Request().Header.Get()当成等价写法——它绕过了 Iris 的上下文封装,可能在中间件链中读到已被修改的 header 副本,尤其当有中间件调用ctx.Header()写响应头时,ctx.Request().Header仍指向原始请求,而ctx.GetHeader()更稳定 - 对空值不做判断:如果头不存在,
ctx.GetHeader()返回空字符串"",不是nil,直接用于解析易 panic;建议先if auth := ctx.GetHeader("Authorization"); auth != "" { ... }
ctx.GetHeader() 和 ctx.Request().Header.Get() 的实际差异
两者底层都从 *http.Request.Header 读,但语义不同:
-
ctx.GetHeader()是 Iris 封装的“安全读取”,它不会触发任何副作用,且在中间件链中行为可预期 -
ctx.Request().Header.Get()是原生 net/http 行为,如果你在某个中间件里调用了ctx.Request().Header.Set("X-Trace-ID", "abc"),后续 handler 用ctx.GetHeader()也能读到,但这是未定义行为——Iris 不保证请求头被修改后ctx.GetHeader()同步刷新,所以**永远不要手动改ctx.Request().Header** - 特别注意
Authorization头:JWT 场景下常需提取 Bearer 后的 token,直接strings.TrimPrefix(ctx.GetHeader("Authorization"), "Bearer ")即可,无需额外解析
哪些 Header 在 Iris 中有快捷访问方法?
Iris 对高频 Header 提供了专用方法,比 GetHeader() 更简洁且带默认逻辑:
-
ctx.Host()→ 等价于ctx.GetHeader("Host"),但自动处理X-Forwarded-Host(若配置了app.Run(iris.Addr(":8080").WithOpt(iris.WithHostProxyHeaders))) -
ctx.RemoteAddr()→ 自动识别X-Real-IP或X-Forwarded-For(同样依赖WithHostProxyHeaders配置) -
ctx.IsAjax()→ 检查X-Requested-With: XMLHttpRequest,返回 bool -
ctx.IsMobile()→ 基于User-Agent字符串做简单匹配,不推荐用于关键业务判断
这些方法省去了字符串判断,但要注意:它们只在启用对应 Proxy 支持时才真正生效,否则退化为原始 header 读取。
调试时怎么一次性看全请求头?
开发期快速 dump 所有请求头,用:
for key, values := range ctx.Request().Header {
app.Logger().Infof("Header %s = %v", key, values)
}
注意:values 是 []string,因为一个 header 可能出现多次(比如多个 Set-Cookie)。生产环境别这么打日志,避免泄露敏感头(如 Authorization、Cookie)。
最容易被忽略的是:Iris 默认不记录原始 header 到 access log,你得自己加中间件或用 ctx.Request().Header 显式采集——很多线上问题(比如 CDN 透传失败、反向代理丢头)都是靠这一步才定位到的。











