Revel路由需满足四重条件才生效:conf/routes文件名小写、UTF-8无BOM、位于根目录conf/下、首行非空;启动日志必须显示“Loaded X routes”,否则未加载;路由匹配区分大小写、斜杠结尾及HTTP方法,动态段不匹配尾部斜杠。

Revel 的路由不是“写完就能用”,conf/routes 文件必须严格满足格式、位置、编码、大小写四重条件,否则请求静默 404,且框架不报错。
conf/routes 文件是否被正确加载?
启动 Revel 应用时,控制台必须出现类似 Loaded 7 routes from conf/routes 的日志;没有这行,说明文件根本没被读取。
-
routes文件名必须全小写,不能是Routes或ROUTES - 文件必须放在项目根目录的
conf/子目录下,不能在conf/dev/或其他嵌套路径 - 编码必须是 UTF-8 无 BOM(Windows 记事本另存时容易加 BOM,会导致解析失败)
- 首行不能为空,建议写成
# This file defines all application routes,某些旧版本会跳过纯空首行
GET /login App.Login 这类基础路由怎么写才有效?
最简路由看似简单,但空格、大小写、括号任一出错都会导致 404,且无编译提示。
- HTTP 方法名必须大写:
GET✅,get❌ - 路径开头不能有空格:
GET /login✅,GET /login❌(前导空格使整行失效) - 控制器与方法名大小写必须和 Go 源码完全一致:
App.Login✅,app.login或App.login❌ - 方法名后不能加括号:
App.Login()是语法错误,App.Login才对
带参数的路由(如 /users/:id)为什么参数拿不到?
路径参数绑定失败不是框架 bug,而是路由定义与控制器方法签名没对齐——Revel 不校验、不报错,只静默跳过。
- 若路由写
GET /users/:id Users.Show,则控制器方法必须接收id参数:func (c Users) Show(id string) revel.Result - 参数名大小写敏感:
ID≠id,写成Show(ID string)就绑定失败 - 类型可自动转换:
id int会尝试转数字,失败直接返回 404(不进方法体) - 多参数顺序必须一致:
GET /a/:x/b/:y A.Handler要求方法签名为Handler(x string, y string),换序即错绑
为什么 /api/users 和 /api/users/ 都访问失败?
Revel 路径匹配是字面量级的,尾部斜杠差异就是两个不同路径,不会自动归一化。
-
GET /api/users和GET /api/users/是两条独立路由,必须分别声明 - 动态段
:id只匹配非斜杠字符,/users/123/中的末尾/不会被:id捕获,整个路径不匹配 - 若需兼容,可显式写正则路由:
GET /api/users/? Users.List(?表示前面的/可选) - 前端 fetch 请求的 URL 必须和
routes中定义的路径**逐字符一致**,包括大小写、空格、斜杠
最常被忽略的是:路由优先级不按书写顺序生效,而是严格分层(字面量 > 通配符 > 正则 > catch-all),写错顺序会导致请求被高优先级通配符提前吃掉,连调试都找不到原因。



















