app.Static() 是唯一正解,filesystem.New() 不处理静态资源路由匹配;需用绝对或正确相对路径,多次调用支持多目录;必须手动防护路径遍历、注册 MIME 类型、配置缓存头并禁用生产重定向。

app.Static() 是唯一正解,别碰 filesystem 中间件
想让 /static/style.css 正常返回,必须用 app.Static(),不是 filesystem.New()。后者是为服务单个文件或生成 HTML 目录索引设计的,压根不处理静态资源路由匹配逻辑。
常见错误:把 filesystem.New("./public", filesystem.Config{Browse: true}) 挂在 app.Use() 下,结果所有 /static/xxx 请求 404——因为 filesystem 中间件默认只响应它自己配置的根路径(比如 /assets),不会自动代理到其他前缀。
-
app.Static("/static", "./public")才是标准写法:第一个参数是 URL 前缀,第二个是本地磁盘路径 - 路径必须是**绝对路径或相对于当前工作目录的相对路径**;若用
./public,确保启动时在项目根目录下执行,否则可能找不到文件 - 多个静态目录需多次调用
app.Static(),例如再加app.Static("/uploads", "./data/uploads") - Fiber 不会自动查找
index.html;要支持目录访问,得额外配Index: "index.html"选项(仅对匹配到目录且无具体文件时生效)
路径安全:别让 ../ 突破沙箱
app.Static() 默认不做路径遍历防护。如果用户请求 /static/../config.yaml,而你的 ./public 目录结构里真有上层文件,就可能被读取。
解决方案只有两个:
- 严格校验本地路径:用
filepath.Clean()+strings.HasPrefix()确保最终解析路径不跳出白名单目录,例如if !strings.HasPrefix(cleaned, "./public/") { c.Status(403).SendString("Forbidden") } - 改用
app.Get("/static/*", ...)手写 handler,在里面做完整路径校验和文件读取,完全掌控流程
别依赖中间件自动过滤——app.Static() 的底层是 fasthttp.FS,它默认允许路径规范化后越界。
缓存与 MIME 类型:浏览器 404 或乱码的根源
静态文件返回 404 不一定是路径错,也可能是 MIME 类型未识别导致浏览器拒绝加载;CSS/JS 显示为纯文本、字体加载失败,大概率是 Content-Type 错了。
- Fiber 内置 MIME 表有限,遇到
.webp、.woff2、.toml等新格式会 fallback 到application/octet-stream - 手动注册:在
app.Static()后加func(c *fiber.Ctx) error中间件,调用c.Set("Content-Type", "..."),或全局用fiber.Config{...}的ServerHeader配置(不推荐) - 强制缓存:加
CacheControl: "public, max-age=31536000"到app.Static()的第三个参数(fiber.Static结构体),避免每次请求都走磁盘 - 注意:CDN 缓存依赖响应头,光配
CacheControl不够,还得确保反向代理(如 Nginx)没覆盖掉它
生产环境必须关掉 Debug 模式下的自动重定向
开发时 app.Static("/static", "./public") 访问 /static(不带尾部斜杠)会 301 重定向到 /static/,但这个行为在生产中可能破坏前端路由或 CDN 缓存键。
- 禁用方法:传入
fiber.Static{Redirect: false},例如app.Static("/static", "./public", fiber.Static{Redirect: false}) - 该选项在 Fiber v2.48+ 生效;v2.47 及更早版本需自行拦截
GET /static并返回 404 或直接 ServeFile - 如果你用的是 SPA(如 Vue/React),前端路由已接管所有路径,这个重定向反而会导致白屏——必须关掉
真正麻烦的不是怎么配,而是配完之后没人检查 curl -I http://localhost:3000/static/main.js 返回的 Content-Type 和 Cache-Control 是否符合预期。线上问题八成出在这两行头信息里。


















