最直接的方式是使用 ctx.cookie.delete(),它自动设置过期时间、max-age=0 并覆盖路径和域名;若原 cookie 指定了 path 或 domain,需显式传入对应配置,否则无法清除。

使用 ctx.Cookie.Delete() 是最直接的方式
在 Fiber 中,ctx.Cookie.Delete() 会自动设置 Expires 为过去时间、Max-Age=0,并覆盖路径和域名以确保浏览器清除对应 Cookie。它不发送空值或 null,而是构造符合 RFC 6265 的清除响应头。
常见错误是手动调用 ctx.Cookie.Set("name", "", 0, ...) —— 这容易漏掉 Path 或 Domain,导致旧 Cookie 仍存在(尤其跨子域或非根路径时)。
-
ctx.Cookie.Delete("session_id")即可安全删除,无需传额外参数 - 若原 Cookie 设置了
Path="/admin"或Domain=".example.com",需显式传入:ctx.Cookie.Delete("token", fiber.Cookie{Path: "/admin", Domain: ".example.com"}) - 注意:Fiber v2.40+ 才支持带配置的
Delete()重载;旧版本只能靠Set()模拟,且必须严格匹配原设置的Path/Domain/Secure/HTTPOnly
手动 Set 空值 + 过期时间只适用于兼容旧版本
当无法升级 Fiber 或需精细控制时,用 ctx.Cookie.Set() 强制覆盖是备选方案,但必须还原原始 Cookie 的所有属性,否则浏览器可能保留多个同名不同 Path/Domain 的 Cookie。
例如,如果登录时设置了:
ctx.Cookie.Set("user", "abc", 3600, "/api", "example.com", true, true, "Lax")
那么删除时必须写成:
ctx.Cookie.Set("user", "", -1, "/api", "example.com", true, true, "Lax")
-
MaxAge设为-1或0均可触发过期(Fiber 内部统一转为0) -
Value设为空字符串"",不能设为nil或省略 -
Path和Domain必须与设置时完全一致,大小写和前导斜杠都不能错
检查 Cookie 是否真被删掉,别只信 DevTools 的 Application 标签
浏览器 DevTools 的 Application → Cookies 列表有时会缓存状态,或显示已过期但仍驻留的条目。真正判断是否删除成功,应看响应头中是否包含形如:
Set-Cookie: session_id=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; HttpOnly
如果看到 Max-Age=0 且 Expires 是 Unix epoch 时间,基本确认服务端已发出清除指令。
- 用
curl -I或 Postman 查响应头最可靠 - 若用了反向代理(如 Nginx),确认它没缓存或篡改
Set-Cookie头 - 前端 JS 调用
document.cookie无法读取HttpOnlyCookie,所以不要用 JS 检查后端设的 Cookie 是否消失
多级子域下删除 Cookie 容易漏掉 Domain 配置
比如你在 auth.example.com 设置了 Domain=".example.com",那么从 app.example.com 删除时,ctx.Cookie.Delete("token") 默认只按当前请求 Host 发送,不会带上 Domain=".example.com",结果删不掉。
必须显式指定:
ctx.Cookie.Delete("token", fiber.Cookie{Domain: ".example.com"})
- 注意点号开头:
".example.com"表示匹配所有子域;"example.com"(无点)只匹配精确域名 - Fiber 不会自动推断跨域意图,
Delete()的默认行为始终基于当前请求的 Host - 如果应用部署在多个一级域名(如
example.com和example.org),需分别调用两次,各自指定对应Domain
Domain 或 Path —— 浏览器把它们当作不同 Cookie 处理,旧的就一直挂着。











