Revel路由与控制器必须严格配对:conf/routes中路径、方法名大小写及空格需完全匹配Go代码,且控制器须位于app/controllers/下、包名为app;否则请求静默失败,返回404或参数为空。

Revel 安装完成后,conf/routes 和 app/controllers 这两处不配对,请求就进不了控制器——不是 404 就是参数为空,而且框架不会报错,只会静默失败。
conf/routes 文件必须严格按格式写,空格和大小写都算数
路由行不能有前导空格,HTTP 方法、路径、控制器方法之间用**单个空格**分隔,且控制器名和方法名必须与 Go 代码中完全一致(包括大小写):
-
GET /login App.Login✅ 正确:路径开头无空格,App和Login首字母大写 -
get /login app.login❌ 失效:方法名小写,Revel 不识别 -
GET /login App.Login❌ 失效:方法名前多一个空格,解析失败 -
GET /login App.Login()❌ 失效:括号是语法错误,routes文件不支持函数调用写法
第一行必须是注释,如 # This file defines all application routes;否则某些旧版本 Revel 会跳过整个文件。
控制器文件位置和包名错一个,路由就永远找不到
Revel 只扫描 app/controllers/ 目录下的文件,且要求包名为 app(不是 main、controllers 或空包名):
- ✅ 正确路径:
app/controllers/user.go,文件开头为package app - ❌ 错误路径:
controllers/user.go(缺app/前缀)、app/handlers/user.go(目录名不对) - ❌ 错误包名:
package controllers或package main→ 方法不会被反射识别,App.Login永远无法调用
结构体方法必须首字母大写,且签名第一个参数是 *App 或对应控制器指针,返回 revel.Result,例如:func (c App) Index() revel.Result。
带参数的路由必须和控制器方法签名对齐,否则 404 不提示原因
路径中用了 :id 或 {id},控制器方法参数就要能接收它:
-
GET /users/:id Users.Show+func (c Users) Show(id string) revel.Result✅ 字符串参数直接匹配 -
GET /users/{id} Users.Show+func (c Users) Show(id int) revel.Result✅ 自动转整型,失败即 404 -
GET /users/:id Users.Show+func (c Users) Show() revel.Result❌ 参数缺失,Revel 不报错但请求直接 404 -
GET /users/:id Users.Show+func (c Users) Show(ID string) revel.Result❌ 参数名大小写不匹配(ID≠id),绑定失败
Revel 的参数绑定是大小写敏感的,且只绑定路径段中的命名捕获,查询参数(如 ?q=abc)需手动用 c.Params.Get("q") 获取。
静态资源映射要改默认路径,不然 /public/ 访问全是 404
Revel 默认不把 /public/ 映射到 URL,而是走 /assets/ —— 这点和大多数框架相反,极易踩坑:
- ✅ 正确做法:在
conf/routes最末尾加GET /assets/*filepath Static.Serve("public") - ✅ 确保文件存在:
app/public/css/app.css→ 可通过http://localhost:8080/assets/css/app.css访问 - ❌ 错误写法:
GET /public/*filepath Static.Serve("public")→ 浏览器访问/public/xxx仍 404 - ❌ 忘记放
app/public/目录 → Revel 启动不报错,但所有静态资源返回 404
模板里引用也要同步改成 /assets/xxx,比如 <link rel="stylesheet" href="/assets/css/app.css">;开发时改了 public/ 下的文件,不会触发热重载,得手动刷新浏览器。



















