直接用go get安装v3并配cors.New()不能直接跑通跨域,必须手动补全AllowOrigins、AllowMethods、AllowHeaders等关键字段,且CORS中间件须置于鉴权等中间件之前。

直接用 go get 安装 v3,再配 cors.New() 就能跑通跨域——但默认配置在带凭证或非简单请求时必然失败,必须手动补全关键字段。
安装 Fiber v3 需要 Go 1.24+
Fiber v3 已不再兼容旧版 Go:go get -u github.com/gofiber/fiber/v3 命令会失败,如果本地 Go 版本低于 1.24。检查版本用 go version;若低于 1.24,先升级 Go 再执行安装。v2 虽仍可用,但官方已停止维护,且不支持 v3 新增的 HTTP 客户端和状态管理特性。
cors.New() 默认配置根本不能处理真实业务场景
浏览器发带 Authorization 头的请求时,会先发 OPTIONS 预检;而 cors.New() 默认只允许 ["GET", "HEAD", "POST"],且 AllowOrigins 是 "*",AllowCredentials 默认为 false——这三者只要有一个不匹配,预检就 404 或 405。
- 前端带
withCredentials: true?后端必须设AllowCredentials: true,且AllowOrigins不能是"*",得写死成[]string{"https://myapp.com"} - 用了
PUT或DELETE?AllowMethods必须显式包含它们,否则预检返回 405 - 前端加了
X-Request-ID或自定义头?AllowHeaders得列出来,"*"不被规范接受 - 没设
MaxAge?每次请求都触发OPTIONS,徒增延迟
正确配置示例:
app.Use(cors.New(cors.Config{
AllowOrigins: []string{"https://myapp.com"},
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
AllowHeaders: []string{"Content-Type", "Authorization", "X-Request-ID"},
AllowCredentials: true,
MaxAge: 3600,
}))
中间件挂载顺序错了,CORS 就白配
cors.New() 必须放在所有可能拦截 OPTIONS 请求的中间件之前,尤其是鉴权、日志、限流类中间件。否则预检请求还没到 CORS 层就被 401 或 429 拦截了。
- 错误顺序:
app.Use(authMW)→app.Use(cors.New())→app.Get("/api/user", h)(authMW会直接 return 401,OPTIONS根本到不了 CORS) - 正确顺序:
app.Use(cors.New())→app.Use(authMW)→app.Get(...) - 如果只给部分路由开跨域,别用
app.Use("/api", cors.New()),而是用链式注册:app.Post("/login", cors.New(), loginHandler)
最易忽略的一点:Fiber 的 c.Params("id") 和 CORS 无关,但很多人在调试跨域失败时顺手改路由,结果发现参数取不到——那不是 CORS 的问题,是路径没声明占位符,比如写了 app.Get("/user", h) 却去访问 /user/123,c.Params("id") 当然为空。


















