根本原因是路径映射未对齐:app.Static()第一个参数(URL前缀)与第二个参数(本地目录)必须严格匹配,且本地路径需相对于当前工作目录;若文件实际位置与挂载路径不一致、工作目录错误或末尾斜杠误用,均导致404。

Fiber 静态资源 404 的根本原因不是代码写错,而是路径映射没对齐。你写了 app.Static("/static", "./public"),但浏览器请求 /static/logo.png 时,Fiber 实际去查的是当前工作目录下的 ./public/logo.png —— 如果文件实际在 assets/css/main.css,而你挂载的是 ./public,那必然 404。
怎么让 app.Static() 正确命中文件
关键在两处路径必须严格对应:
- 第一个参数(URL 前缀)决定浏览器怎么访问,比如
"/static"→ 请求/static/js/app.js - 第二个参数(本地目录)决定 Fiber 去哪找,比如
"./public"→ 查./public/js/app.js(相对当前工作目录) - Windows 下用
/或\都行,但"./public/"末尾带斜杠可能在某些 Go 版本 panic,建议写成"./public" - 用
go run main.go启动时,工作目录是终端所在路径;IDE 运行需检查其默认工作目录设置,别假设它和main.go在同一级
为什么 app.Use(static.New(...)) 容易出问题
这不是中间件用法,而是 Handler 注册,且行为和 app.Static() 完全不同:
-
app.Use("/assets", static.New("./public/assets"))表示:只响应以/assets开头的请求,并把路径后半段直接拼到./public/assets后面 - 不能写成
app.Use("/assets/", static.New(...))(尾部斜杠会导致子路径失效) -
static.New()默认不校验路径遍历,../../../etc/passwd可能被原样解析,必须手动加.EnableDirListing(false)或前置拦截".." - 它不自动设
Cache-Control、不支持Index文件、也不压缩,这些都要自己配或换回app.Static()
favicon.ico 怎么单独处理最稳妥
别指望浏览器自动 fallback 到根目录找图标,显式注册才可靠:
- 把
favicon.ico放进./public/favicon.ico(或其他你确定存在的路径) - 用
app.Static("/favicon.ico", "./public/favicon.ico")单独挂载 —— 这是最轻量、最明确的方式 - 不要写成
app.Use("/favicon.ico", static.New("./public")),因为static.New()会尝试匹配完整路径,而/favicon.ico是文件,不是目录 - 如果用了防盗链中间件,必须把它放在
app.Static()之前,否则图标请求直接返回,中间件压根不执行
真正容易被忽略的点是:Fiber 的静态服务完全不感知你的模板引擎或路由定义,c.Render() 和 /static/xxx 是两条平行线。挂载漏了,就是 404;路径差一级,就是 404;工作目录不对,还是 404 —— 没有隐式 fallback,也没有“差不多就行”。


















