rewrite中间件必须用app.Use()注册才生效,不能用app.Get()或app.All();它在路由匹配前执行路径重写,需置于app.Static()之前,规则仅支持单个末尾*通配符,不识别:param等路由参数语法。

rewrite中间件怎么注册才生效
必须用app.Use()注册,不能用app.Get()或app.All()——rewrite是请求进入路由匹配前的预处理动作,属于中间件层级。它在所有路由解析之前运行,把原始请求路径改写成另一个路径,再交由后续流程处理。
常见错误是把它当路由 handler 写进app.Get("/old", rewriteHandler),结果完全不触发重写逻辑。
- 正确写法:
app.Use(rewrite.New(rewrite.Config{Rules: map[string]string{...}})) - 规则映射是字符串到字符串,左边是原始路径模式(支持通配符
*),右边是目标路径 - 中间件必须放在
app.Static()之前,否则静态文件服务会先命中并返回,rewrite没机会执行
路径规则里*和:param能混用吗
不能。rewrite规则不识别:id这类 Fiber 路由参数语法,只认*通配符,且仅支持一个*,位置必须在规则左侧末尾。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
例如"/api/*": "/backend/*"合法;而"/api/:version/*": "/v2/*"会直接失效——:version被当作普通字符串匹配,不会提取也不会替换。
-
"/*": "index.html"→ 所有未命中静态资源的路径都指向index.html(SPA 路由兜底) -
"/blog/*": "/posts/*"→ 把/blog/2024/golang重写为/posts/2024/golang -
"/old-path": "/new-path"→ 精确匹配,无通配,不带/结尾则/old-path/不匹配
重写后路由匹配不到怎么办
rewrite只是改c.Path(),不改变c.OriginalURL()或c.Request().URI().Path()原始值,但 Fiber 的路由匹配完全基于改写后的路径。如果重写后仍 404,说明目标路径没注册对应路由,或StrictRouting导致末尾斜杠不一致。
- 检查重写后的路径是否真实存在路由:比如重写
"/user"→"/api/user",就得确保有app.Get("/api/user", ...) - 若目标路径带结尾斜杠(如
"/api/user/"),而你只注册了"/api/user",StrictRouting开启时就会 404 - 调试技巧:在第一个中间件里加
log.Println("path:", c.Path(), "original:", string(c.Request().URI().Path())),确认 rewrite 是否生效、改成了什么
rewrite和路由Group、反向代理怎么配合
rewrite 是路径层面的字符串替换,不涉及协议、host 或后端转发;它和app.Group()无直接关系,但可与反向代理形成两级处理:先 rewrite 统一前缀,再 proxy 转发。
- 典型组合:前端 SPA 部署,用
rewrite兜底所有非静态资源路径到index.html,再用app.Static()托管./build目录 - 若需转发 API 请求,应单独用
fasthttp.NewReverseProxy,而不是靠 rewrite —— rewrite 不改 Host、不发 HTTP 请求,它只改路径字符串 - 别试图用 rewrite 模拟 CORS 或 OPTIONS 预检:浏览器发的
OPTIONS /api/user被重写成/backend/api/user后,若后端没配 OPTIONS handler,照样 404


















