应优先用c.get("x-request-id")安全提取单值,因其大小写不敏感且返回第一个值;需获取全部同名header(如set-cookie)时,必须用c.request.header["set-cookie"]切片遍历。

用 c.Get 还是 c.Request.Header.Get?
两者效果一致,c.Get 是 Fiber 对 c.Request.Header.Get 的封装,内部调用同一逻辑。但要注意:c.Get 会自动忽略大小写并返回第一个值,适合单值 Header(如 X-Request-ID、Content-Type);若需获取全部同名 Header 值(比如多个 Set-Cookie),必须直接访问 c.Request.Header["Set-Cookie"],它返回 []string。
为什么 c.Get("cookie") 拿不到完整 Cookie 字符串?
Fiber(底层 fasthttp)对 Cookie 字段做了特殊处理:它会自动解析并拆分为 map[string]string,再通过 c.Cookies() 提供访问。所以:
-
c.Get("Cookie")返回的是原始未解析的字符串(如果存在) -
c.Cookies()才是推荐方式,返回解析后的键值对,例如c.Cookies("session_id") - 若你确实需要原始 Cookie 行(比如做签名校验),应改用
c.Request.Header.Peek("Cookie")—— 这个方法绕过 fasthttp 的自动解析,直接读取原始字节
大小写敏感吗?字段名要不要首字母大写?
fasthttp 内部对 Header 键做了规范化(CanonicalMIMEHeaderKey),所以 c.Get("x-forwarded-for")、c.Get("X-Forwarded-For")、c.Get("x-forwarded-for") 全部等效。但注意:
- 不要依赖原始输入格式,统一用 kebab-case 风格(如
X-Real-IP)更稳妥 -
c.Request.Header是map[string][]string,但 key 已被标准化,直接用c.Request.Header["X-Real-Ip"]会查不到——必须用c.Request.Header["X-Real-IP"] - 用
Peek时也需传标准化后的 key,否则可能返回 nil
中间件里修改请求头后,后续 handler 能看到吗?
不能。Fiber 的 c.Request.Header 是只读映射(底层 fasthttp 不允许运行时写入请求头),任何对 c.Request.Header.Set 或 Add 的调用都会 panic。如果你需要注入或覆盖 Header(比如网关透传),唯一安全的方式是:
- 在反向代理层(如用
fasthttp.Client发起下游请求时)设置req.Header.Set - 或在 handler 中用
c.Locals存临时数据,再由下游逻辑读取,而非篡改原始 Header - 误以为
c.Set("X-My-Header", "xxx")是设请求头——其实这是设响应头,别混淆











