Fiber访问路由返回空404是因为未配置兜底中间件,需在所有路由注册后用app.Use()添加末尾中间件,检查c.Response().StatusCode()==0再返回结构化JSON 404响应。

直接访问路由返回空 404 或无响应,大概率不是路由写错了,而是框架根本没走到你的 handler——Fiber 默认对未匹配路径不做任何处理,只发一个空响应体 + 404 状态码。
为什么 app.Get("/user", h) 注册了却访问不了
最常见原因是路径开头漏了 /。Fiber 路由必须以斜杠开头,app.Get("user", h) 完全无效,它连匹配逻辑都不会触发。
- 检查所有
app.Get()、app.Post()的第一个参数:必须是"/xxx"形式,不能是"xxx"或"//xxx" - 确认请求 URL 和注册路径完全一致:大小写、尾部斜杠、多余空格都要对得上
-
c.Path()打印出来看看实际匹配到的是什么,别靠猜 - StrictRouting 默认开启,
/users和/users/是两条独立路由;只注册了前者,后者必然 404
如何捕获未匹配路由并返回结构化 404
Fiber 没有 @app.errorhandler(404) 这种语法,必须用 app.Use() 挂一个兜底中间件,且它必须放在所有 app.Get() 之后。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 顺序错误就失效:中间件必须是
app.Use()调用链的最后一个环节 - 中间件内要先判断
c.Response().StatusCode() == 0,否则可能 panic 或被忽略 - 推荐返回 JSON:
c.Status(404).JSON(map[string]string{"error": "not found"}) - 别用
c.SendString()硬编码 HTML,除非你确定前端只接受文本
StrictRouting 导致的“看似能配却访问不到”
关掉 StrictRouting: false 看似能解决尾斜杠问题,但它会破坏参数路由优先级:比如同时注册了 app.Get("/users", h1) 和 app.Get("/users/:id", h2),关掉后 /users/123 可能被 h1 错误匹配。
- 更稳妥的做法是在兜底中间件里做重定向:
if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) } - 或者显式注册两个版本:
app.Get("/users", h)和app.Get("/users/", h) - 重定向中间件必须放在兜底中间件之前,否则 404 已发出,再 redirect 就无效
请求根本没进 Fiber 怎么排查
如果 curl -I 返回 200 却页面空白,或看到 Nginx 默认 404 页面,说明请求压根没到 Go 进程。
- 检查反向代理配置(Nginx/Apache):是否把所有非静态资源请求都
proxy_pass到 Fiber 监听端口 - 本地直连测试:
curl http://localhost:3000/nonexistent,看是否触发你写的兜底中间件 - 确认 Nginx 没启用
error_page 404,否则它会劫持本该由 Fiber 处理的 404 - 别用
fiber.Default()启动,它自带的 logger 中间件在 panic 时会打满屏堆栈,干扰诊断
最容易被忽略的点:兜底中间件位置必须严格在所有路由注册之后,且内部必须检查 c.Response().StatusCode() == 0;这两条不满足,404 就永远是空的。


















