c.Get("User-Agent")足够安全便捷,它自动处理大小写、空格、多值合并及常见别名;而c.Request().Header.Peek()需手动转换字节、处理空格和分隔符,易出错。

直接用 c.Get() 拿请求头,别碰 c.Request().Header.Peek()
绝大多数场景下,c.Get("User-Agent") 就够了——它内部做了大小写不敏感匹配、自动去除前后空格、处理重复头合并(如多个 Set-Cookie),还兼容常见别名(X-Forwarded-For 和 X-Real-Ip 都能 fallback)。手撕 c.Request().Header.Peek() 不仅要自己转 []byte 为字符串,还得手动处理多值、编码、空格,一不留神就漏掉 X-Forwarded-For 的第一个 IP。
常见错误现象:
-
c.Get("x-forwarded-for")返回空 → 头名大小写无关,但必须拼写准确,不能少短横或大小写错位 -
c.Get("Authorization")拿到"Bearer xxx"却没拆 →c.Get()只返回原始值,解析 Bearer Token 得自己切分 - 用
c.Request().Header.Peek("X-Forwarded-For")拿到字节切片却忘了string()转换 → 直接打印是乱码,日志里显示[105 112 46 97 100 100 114]
c.Get() 和 c.Request().Header.Peek() 的关键差异在哪
c.Get() 是 Fiber 封装后的安全接口,c.Request().Header.Peek() 是 fasthttp 原生方法,二者行为完全不同:
-
c.Get("X-Forwarded-For")自动取逗号分隔的第一个非空 IP(跳过"127.0.0.1, 203.0.113.195"中的 localhost) -
c.Request().Header.Peek("X-Forwarded-For")原样返回整个[]byte,包括所有空格和多余逗号 -
c.Get("Content-Type")会标准化成小写并去掉参数("application/json; charset=utf-8"→"application/json") -
c.Request().Header.Peek("Content-Type")返回完整原始值,含分号与参数 - 当请求头缺失时,
c.Get()返回空字符串;Peek()返回 nil[]byte,直接string(nil)是空字符串,但用len()判断会 panic
读取客户端真实 IP 的正确姿势
别只信 c.IP(),它默认只看 RemoteAddr,在 Nginx 反代后全是 127.0.0.1。必须组合多个头手动提取:
- 优先取
c.Get("X-Forwarded-For"),按逗号分割,取第一个非私有 IP(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.1) - fallback 到
c.Get("X-Real-Ip")(Nginx 常配) - 最后 fallback 到
c.IP()(仅限直连或可信内网) - 千万别用
c.Request().Header.Peek("X-Forwarded-For")后直接strings.Split()—— 没 trim 空格会导致" 192.168.1.100 "被当成非法 IP
示例逻辑:
ip := c.Get("X-Forwarded-For")
if ip != "" {
for _, part := range strings.Split(ip, ",") {
ip = strings.TrimSpace(part)
if !isPrivateIP(ip) {
break
}
}
}
if ip == "" {
ip = c.Get("X-Real-Ip")
}
if ip == "" {
ip = c.IP()
}
容易被忽略的缓存与代理头陷阱
某些 CDN 或反向代理会改写甚至删除特定请求头,导致你读不到预期值:
-
Authorization头在某些 CDN(如 Cloudflare)免费版中默认被剥离 → 必须在 CDN 控制台显式开启“传递 Authorization 头” -
Cookie头可能被代理截断(尤其超长时),c.Cookies()会返回空,但c.Get("Cookie")仍可拿到原始字符串 -
Accept、Accept-Language这类协商头,浏览器可能发多个值("text/html,application/xhtml+xml"),c.Get()返回完整串,需自行解析优先级 - 自定义头如
X-Request-ID若含下划线(X_Request_ID),Nginx 默认丢弃 → 必须在 Nginx 配置中加underscores_in_headers on;
上线前务必用 curl 模拟真实链路验证:curl -H "X-Forwarded-For: 203.0.113.195, 127.0.0.1" http://localhost:3000/api/test,别只在本地用 Postman 测。


















