Fiber框架不自动处理CORS预检缓存,因无内置CORS中间件,Access-Control-Max-Age需手动在OPTIONS路由中设置并返回204状态码,否则浏览器无法缓存预检响应。

必须手动在 OPTIONS 路由响应中写入 Access-Control-Max-Age,Fiber 本身不自动处理预检缓存,也不提供内置 CORS 中间件。
为什么 Fiber 的 CORS 配置不包含预检缓存控制
Fiber 框架默认不集成 CORS 逻辑,也没有像 Flask-CORS 或 Laravel-Cors 那样的开箱即用包。所有跨域头(包括 Access-Control-Max-Age)都得由开发者显式添加。如果你只用了 c.Set() 或全局中间件但没覆盖 OPTIONS 请求,浏览器就收不到该头,预检永远不会被缓存。
- 预检缓存只在
OPTIONS响应里生效,GET/POST响应里设Access-Control-Max-Age完全无效 - Fiber 的
fiber.Ctx对象没有.Cors()方法或类似快捷 API - 第三方中间件(如
fiber/cors)大多只处理简单头注入,仍需你补上Access-Control-Max-Age
手动注册 OPTIONS 路由并设置缓存时间
最稳妥的方式是显式定义 OPTIONS 处理器,确保每个需要跨域的路径都有对应响应。不要依赖 app.Use() 全局拦截 —— 它无法区分方法,容易漏掉或误配。
- 对通配路径注册:
app.Options("/*", func(c fiber.Ctx) error { c.Set("Access-Control-Allow-Origin", "*") c.Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") c.Set("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With") c.Set("Access-Control-Allow-Credentials", "true") c.Set("Access-Control-Max-Age", "86400") // 缓存 24 小时 return c.SendStatus(204) }) - 若需支持凭证(
credentials: 'include'),Access-Control-Allow-Origin不能为*,应动态读取c.Get("Origin")并白名单校验后再设置 - 务必返回
204 No Content,避免用200+ 空体 —— 部分浏览器对200 OPTIONS响应不缓存
与 Nginx 或反向代理共存时的关键冲突点
如果你在 Fiber 前还套了一层 Nginx Proxy Manager 或 CDN,即使 Fiber 正确返回了 Access-Control-Max-Age,也可能被代理层清洗或覆盖。
- Nginx 默认不透传
OPTIONS响应头,需确认配置中有add_header Access-Control-Max-Age "86400" always; - CDN(如 Cloudflare)可能忽略非标准缓存头,建议同时加
Cache-Control: public, max-age=86400 - 若使用
proxy_pass,检查是否启用了proxy_cache_bypass $request_method—— 它会让OPTIONS请求绕过缓存,导致缓存失效
真正起作用的不是“配了什么”,而是浏览器最终收到的 OPTIONS 响应里有没有那个 Access-Control-Max-Age 头、值是否合法、且未被中间层截断。调试时直接看 Network 面板里 OPTIONS 请求的 Response Headers,别信后端日志或本地 curl 输出。


















