revel通配路径*filepath必须位于路由末尾且唯一,捕获完整子路径;static.serve首参为相对app/的目录名,不加斜杠或点号;通配路由优先级低于精确匹配但高于泛匹配。

通配路径必须放在路由末尾
Revel 的 *filepath 通配符只能出现在 URL 模式最后一个斜杠之后,且整条路由中最多一个。写成 GET /files/*filepath Files.Serve 是合法的;但 GET /files/*filepath/preview Files.Serve 或 GET /*prefix/*suffix Static.Serve 都会解析失败,启动时直接 panic。
通配参数值包含完整路径片段(含斜杠)
与命名参数(如 :id)只匹配单个路径段不同,*filepath 会捕获从匹配点开始到 URL 结尾的全部内容,包括中间所有 /。例如请求 /public/images/logo.png 时,c.Params.Get("filepath") 返回的是 images/logo.png,不是 logo.png。
- 若路由是
GET /static/*filepath Static.Serve("static"),则/static/→filepath = "" -
/static/css/app.css→filepath = "css/app.css" -
/static/js/lib/a/b/c.js→filepath = "js/lib/a/b/c.js"
静态文件服务必须显式传入根目录路径
使用 Static.Serve 时,第一个参数是本地文件系统路径(相对 app/ 目录),不是 URL 路径。常见错误是把 Static.Serve("public") 写成 Static.Serve("/public") 或 Static.Serve("./public") —— Revel 会按应用根目录拼接,"public" 才对,加斜杠或点号反而导致路径错位。
第二个参数(可选)用于指定默认文件,如 GET /favicon.ico Static.Serve("public", "img/favicon.png"),注意这里 "img/favicon.png" 是相对于 public/ 目录的子路径,且逗号和引号之间不能有空格(因底层用 encoding/csv 解析)。
通配路由优先级低于精确匹配,但高于命名参数
Revel 按 routes 文件从上到下匹配,且通配路由(* 或 *filepath)属于最低优先级的「兜底」规则。这意味着:
-
GET /admin/users/:id Admin.ShowUser会先于GET /admin/*filepath Static.Serve("admin")匹配/admin/users/123 - 但
GET /admin/*filepath Static.Serve("admin")仍会覆盖* /:controller/:action :controller.:action这种泛匹配,因为前者更具体 - 如果两条通配路由冲突(如
/files/*a和/files/*b),只有第一条生效,第二条被忽略
最容易被忽略的是:通配路径不校验是否存在对应文件——Static.Serve 在找不到文件时返回 404,但路由本身已成功匹配。调试时别误以为是路由没生效,实际是文件路径拼错了。











