c.Get() 是最安全的请求头读取方式,大小写不敏感、空值返回空字符串;c.GetReqHeaders() 返回全部头的深拷贝 map;需显式配置可信代理才能正确解析 X-Forwarded-For 等真实 IP 头;所有头读取结果不可跨 handler 生命周期使用。

直接用 c.Get() 读取指定请求头
Fiber 的 c.Get() 是最常用、最安全的请求头读取方式,它自动处理大小写不敏感匹配和空值返回。比如获取 Authorization 头:c.Get("Authorization") 和 c.Get("authorization") 效果一样;如果头不存在,返回空字符串,不会 panic。
注意它只读取原始请求头,不解析内容(比如不拆解 Bearer Token),需要你自己后续处理。
- 常见误用:传入带
Header:前缀的字符串,如c.Get("Header:User-Agent")—— 这会失败,应传"User-Agent" - 对标准头(如
Content-Type)也适用,但注意Content-Type可能含 charset 参数,c.Get()返回完整值,需手动截取 - 不建议用
c.Request().Header.Peek()替代,它返回[]byte,易引发内存越界或编码问题
c.GetReqHeaders() 返回全部头的 map 拷贝
当需要遍历或调试所有请求头时,c.GetReqHeaders() 返回一个 map[string][]string 的深拷贝,结构清晰、线程安全,适合日志记录或条件判断。
这个 map 是 Fiber 内部从 fasthttp.Request.Header 构建的副本,修改它不影响原始请求;但别把它存到 goroutine 外或长期缓存——c 是池化对象,下次复用时内容已重置。
- 不要用
c.Request().Header.Header()直接访问底层 map,它返回的是未拷贝的指针,可能在后续中间件中被覆盖 - 该方法在 v3 中仍可用,但性能略低于单次
c.Get(),批量读多个头时才值得调用 - 注意:map 中的 value 是
[]string,因为 HTTP 允许同名头多次出现(如多个Set-Cookie),但普通请求头如User-Agent通常只有一个元素
特殊头如 X-Forwarded-For 需手动解析客户端真实 IP
c.IP() 和 c.IPs() 虽然方便,但默认只读 RemoteIP,在反向代理后会拿到 Nginx 或 Cloudflare 的 IP。要还原真实客户端 IP,得依赖 X-Forwarded-For 或 X-Real-IP 等代理头。
Fiber 不自动信任这些头,必须显式配置可信代理段(via app.Config().ProxyHeader 或中间件),否则 c.IP() 仍返回直连 IP。
- 若没配可信代理,直接
c.Get("X-Forwarded-For")拿到的是字符串,需用strings.Split()提取第一个非空项,但存在伪造风险 -
c.IPs()在配置可信代理后才生效,返回按信任链顺序解析出的 IP 列表,首项为最外层客户端 IP - Cloudflare 场景下,
X-Forwarded-For可能被覆盖,优先检查Cf-Connecting-Ip头(需单独c.Get("Cf-Connecting-Ip"))
读取头时容易忽略的生命周期陷阱
Fiber 的 c 是 sync.Pool 复用对象,所有头读取方法都基于当前请求快照。一旦 handler 执行结束,c 就被归还池中并重置——这意味着你不能把 c.Get() 结果或 c.GetReqHeaders() 返回的 map 保存到 goroutine、闭包或全局变量里供后续使用。
尤其注意中间件组合场景:某个中间件调用了 c.Get("Authorization") 并把结果传给下游 goroutine,该 goroutine 若在 handler 返回后才执行,拿到的可能是其他请求的头数据,或已清零的脏值。
- 正确做法:在 handler 内完成所有头解析,并把提取后的结构体(如 token 字符串、用户 ID)作为参数传入 goroutine
- 不要在
defer中读头,除非确保 defer 在 handler 返回前执行完毕 - 测试时用
app.Test()发起请求,避免因复用导致头值“残留”造成误判











