应使用 ctx.Set() 设置单值响应头(如 Content-Type),用 ctx.Append() 追加多值头(如 Set-Cookie),CORS 等复杂头推荐配置 fiber.Cors() 中间件,重定向和错误响应中需手动补全必要头。

设置单个响应头用 ctx.Set()
直接调用 ctx.Set() 是最常用方式,它会自动覆盖同名已有头(包括框架内部可能设过的),适合设置 Content-Type、X-Request-ID 这类单值头。
注意:ctx.Set() 不做值合法性校验,传入空字符串或含换行符的值会导致 HTTP 协议错误;如果值里有逗号分隔的多个项(比如 Cache-Control),得自己拼好再传。
示例:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
func handler(c *fiber.Ctx) error {
c.Set("X-Frame-Options", "DENY")
c.Set("Content-Type", "application/json; charset=utf-8")
return c.SendString(`{"ok": true}`)
}
追加响应头用 ctx.Append()
当需要往已有头后面追加值(比如多个 Set-Cookie 或重复的 Link 头),不能用 ctx.Set(),否则后设的会覆盖前面的。此时必须用 ctx.Append()。
立即学习“go语言免费学习笔记(深入)”;
常见踩坑点:误以为 ctx.Set("Set-Cookie", "a=1") 和 ctx.Set("Set-Cookie", "b=2") 能发两个 cookie —— 实际只发了第二个。正确写法是两次调用 ctx.Append("Set-Cookie", ...)。
示例:
func handler(c *fiber.Ctx) error {
c.Append("Set-Cookie", "sessionid=abc; HttpOnly; Path=/")
c.Append("Set-Cookie", "theme=dark; Max-Age=86400")
return c.SendStatus(204)
}
设置带条件的响应头(如 CORS)推荐用中间件
手动在每个路由里写 c.Set("Access-Control-Allow-Origin", "*") 容易漏、难维护。Fiber 自带 fiber.Cors() 中间件,但默认配置宽松,生产环境需显式限制来源和方法。
关键参数:AllowOrigins 应该是具体域名列表(不要留 *),AllowHeaders 需包含前端实际发的自定义头(比如 X-Auth-Token),否则预检请求会失败。
示例(安全最小集):
app.Use(fiber.Cors(&fiber.CorsConfig{
AllowOrigins: "https://myapp.com",
AllowMethods: "GET,POST,PUT,DELETE",
AllowHeaders: "Content-Type,X-Auth-Token",
ExposeHeaders: "X-Total-Count",
MaxAge: 3600,
}))
响应头在重定向和错误处理中容易被忽略
用 c.Redirect() 或 c.Status(401).JSON(...) 时,很多人忘了设头。Fiber 的 Redirect 默认不带额外头,Status().JSON() 也只设 Content-Type,其他头(如 Retry-After、X-RateLimit-Reset)必须手动补。
尤其注意:重定向响应里设 Set-Cookie 是有效的,但浏览器是否接受取决于 SameSite 和 Secure 属性;HTTP/2 环境下,重复设置同一头名可能被底层连接复用逻辑合并或丢弃。
建议统一用 ctx.Context().Response.Header.Set() 绕过 Fiber 封装(仅限特殊场景),但要清楚这会跳过 Fiber 对头名大小写的标准化处理。

















