c.set()用于覆盖写单个响应头,如c.set("x-frame-options", "deny");注意不区分大小写、空值会删除头、content-type需手动设、动态值应先拼接再传入,且须与c.append()严格区分用途。

用 c.Set() 写单个响应头最直接
绝大多数场景下,c.Set("X-Frame-Options", "DENY") 就够用了。它底层调用的是 ctx.Response().Header.Set(),会覆盖同名已有头。注意键名不区分大小写(HTTP 规范),但建议统一用 PascalCase 或全大写保持可读性。
常见误操作:传入空值或 nil 字符串导致 header 被清空 —— c.Set("Content-Type", "") 实际会删掉该 header,不是设为空字符串。
- 设置多个同名头要用
c.Append(),比如c.Append("Set-Cookie", "a=1; Path=/") -
c.Set()不会自动加Content-Type,即使你调了c.JSON()也得自己设,否则默认是text/plain; charset=utf-8 - 若需动态拼接值(如带时间戳的 ETag),推荐先构造字符串再传给
c.Set(),避免在函数调用中做复杂计算
c.Set() 和 c.Append() 的行为差异必须分清
c.Set() 是「覆盖写」,c.Append() 是「追加写」。这对 Cache-Control、Vary、Access-Control-Allow-Headers 这类允许多值的 header 尤其关键。
例如跨域场景:c.Set("Access-Control-Allow-Origin", "*") 后再调 c.Append("Access-Control-Allow-Headers", "X-Token"),最终响应头里会有两个独立的 Access-Control-Allow-Headers 行(HTTP/1.1 允许);但若两次都用 Set(),后者会完全替换前者。
- 浏览器对重复 header 的处理不一致,某些旧版 Safari 会丢弃第二个
Set-Cookie—— 所以 Cookie 必须用c.Cookie()方法,别手动Set() -
c.Append()对Content-Type无效,它只接受单值,强行调用会静默失败 - 如果中间件链里多个环节都设同一个 header(比如鉴权中间件和日志中间件都设
X-Request-ID),结果取决于执行顺序和用的是Set还是Append
全局响应头要在 fiber.Config 里配 ServerHeader
像 Server: fiber 这种所有响应都带的头,不该在每个 handler 里重复写 c.Set("Server", "myapp")。正确做法是在初始化时配置:
app := fiber.New(fiber.Config{
ServerHeader: "myapp/1.0",
})
这个字段只控制 Server 头,其他通用头(如 X-Content-Type-Options)仍需用中间件统一注入。
- 别试图用
app.Use(func(c *fiber.Ctx) error { c.Set(...); return c.Next() })来塞全局头 —— 如果某个 handler 提前写了响应(比如c.SendString()),中间件里的Set()就失效了 -
ServerHeader设为空字符串("")可彻底禁用该 header,比用中间件覆盖更干净 - Fiber v3 默认开启
StrictRouting,但这个配置和响应头无关,别混淆
响应头顺序和大小写不影响 HTTP 协议,但影响调试体验
HTTP 协议本身不规定 header 顺序,但你在 curl -v 或 Chrome DevTools 里看到的顺序,取决于 fasthttp 底层写入 buffer 的顺序 —— 也就是你调用 c.Set() 的先后。这不会影响功能,但排查问题时容易看漏。
另外,虽然 c.Set("content-type", "application/json") 也能工作,但建议始终用标准命名(Content-Type),因为部分代理或安全网关会按规范名做匹配。
- 用
c.GetRespHeaders()只能拿到已写入的 header 副本,不能修改;它主要用于测试断言,不是运行时工具 - 不要在
defer里设响应头 ——defer在 handler 返回后才执行,此时 response 已经开始写入连接,Set()无效 - 如果你发现 header 没生效,第一反应不是框架 bug,而是检查是否 handler 已返回、是否被中间件提前终止、是否用了错误的方法名(比如把
Set写成set)











