revel自定义404页面仅在run.mode = prod时生效,dev模式下强制返回调试堆栈;需确认终端输出“running in 'prod' mode”,且conf/app.conf中results.error.404 = 404.html须置于[prod]区块内,app/views/errors/404.html模板必须存在并包含{{template "header.html" .}}等布局调用。

确认Revel是否真的在prod模式下运行
Revel的自定义404页面只在run.mode = prod时生效,dev模式下无论怎么配都会返回带堆栈的调试页或空白页。启动后看终端输出有没有Running in 'prod' mode——没有就说明配置没生效。常见原因是conf/app.conf里run.mode被写在了错误区块(比如写在[dev]里却期望它影响全局),或者被后面重复定义覆盖。检查时注意:同一配置项在多个区块中出现,后加载的区块会覆盖前一个。
检查results.error.404配置格式和位置
必须在[prod]区块(不能是[dev]或无区块)下写这一行:results.error.404 = 404.html。等号前后必须有空格,不能写成results.error.404=404.html;路径必须是纯文件名404.html,不能带目录(如errors/404.html)、不能用其他后缀(如404.tpl)。Revel不校验该文件是否存在,配错只会静默失效。
创建app/views/errors/404.html并确保结构完整
这个路径必须手工创建,Revel不会自动建errors/子目录。模板内容要包含标准布局调用,否则CSS、导航栏全丢:
-
{{set . "title" "Page Not Found"}}—— 必须设title,否则Layout可能渲染异常 -
{{template "header.html" .}}和{{template "footer.html" .}}—— 继承主布局,不能省略 - 不要直接写
...纯HTML,那会脱离框架上下文
最小可用模板示例:{{set . "title" "Page Not Found"}}{{template "header.html" .}}<div class="error-container">
<h1>Oops! You're lost.</h1>
<p>The page you requested doesn't exist.</p>@#@#@#@#@#@#@#@#@#@0</div>{{template "footer.html" .}}
验证404链路是否真正打通
手动访问一个明显不存在的路径(如/nonexistent),观察响应:
- 看到白页或
{"error":"Not Found"}→ 模板未加载,回头检查app/views/errors/404.html路径和命名 - 看到带堆栈的Go panic → 还在dev模式,
run.mode没生效 - 看到页面但样式错乱、无导航 → 模板里漏了
{{template "header.html" .}}或{{template "footer.html" .}}
最容易被忽略的是:Revel对errors/目录大小写敏感,且不报错提示缺失——文件放错位置(比如放在app/views/404.html根目录)时,它就当没这回事,直接走默认逻辑。











