Web 文件必须放在 public/ 目录下:Revel 框架硬性规定所有可通过 HTTP 直接访问的静态资源(CSS、JS、图片等)须置于应用根目录下的 public/ 中,路由自动映射 /public/xxx 到文件系统 public/xxx,其他路径一律 404;非静态文件(如数据库、上传文件)严禁放入 public/,应存于同级私有目录(如 data/、uploads/)并通过控制器读写。

Web 文件该放哪:public/ 是唯一合法静态资源根目录
Revel 框架硬性规定:所有可通过 HTTP 直接访问的静态文件(CSS、JS、图片、字体等)必须放在 public/ 目录下,且该目录必须位于应用根目录(即包含 app/、conf/ 的同级位置)。Revel 的 HTTP 路由器会自动将 /public/xxx 请求映射到 public/xxx 文件系统路径——这是框架内置逻辑,不可绕过或重配置。
常见错误现象:http://localhost:9000/css/style.css 404,但文件实际在 app/views/css/ 或 resources/static/ 下;这是因为 Revel 只认 public/,其他路径一律不提供静态服务。
- 不要把前端构建产物(如 Webpack 输出)丢进
app/views/或conf/——它们不会被 HTTP 服务 - 不要尝试用
revel.Static或自定义路由“代理”到非public/目录——既无效,也破坏框架约定 - 开发时若需分离前后端源码(如用 FIS),必须确保构建后文件最终落进
server/public/(见知识库中 FIS 配置示例)
数据库文件、上传文件等运行时生成内容不能放 public/
SQLite 数据库、用户上传的头像、日志归档等**非公开、非静态**文件,绝不能放在 public/ 下。否则会被直接 HTTP 访问,造成敏感数据泄露(例如 public/data/app.db 可被任何人下载)。
正确做法是:统一放在 data/、uploads/ 或 storage/ 这类**与 public/ 同级的私有目录**中,并通过控制器逻辑读写(如 c.DB 连接 SQLite 时指定 ./data/app.db)。
-
os.Getwd()和runtime.Caller()在 Revel 中不可靠(尤其revel test或二进制部署时),会导致路径指向 CLI 工具或临时目录 - 推荐用相对路径 + 应用根目录锚定:启动时用
revel.BasePath(Revel 提供的已解析项目根路径)拼接,例如filepath.Join(revel.BasePath, "data", "app.db") - 确保
data/目录存在且进程有读写权限;容器部署时需显式挂载该目录,避免写入只读文件系统
模板和视图文件路径由 Revel 强约束,不可自定义
HTML 模板文件必须放在 app/views/ 下,按控制器名/方法名嵌套(如 app/views/App/Index.html),这是 Revel 模板引擎查找逻辑的硬编码路径。你无法通过配置把它改成 templates/ 或 views/frontend/。
注意:app/views/ 下的文件**不会被 HTTP 直接访问**(Revel 自动禁用该路径的静态服务),所以放在这里是安全的。但这也意味着你不能用 <img src="/views/logo.png" alt="Revel框架Web文件存储路径如何规划" > 这种写法——它必须先拷贝到 public/img/ 才能被引用。
- 模板中引用静态资源,路径必须以
/开头(即相对于站点根),且只能指向public/下的子路径,例如<link href="/css/app.css"> - 不要在模板里写
<img src="app/views/images/logo.png" alt="Revel框架Web文件存储路径如何规划" >—— 这个路径根本不存在于 HTTP 空间 - 如果要用 FIS 等工具处理模板内资源路径,需确保其输出目标仍是
public/,而非试图修改app/views/结构
生产环境必须配合反向代理隔离 public/ 与应用逻辑
Revel 自带的 net/http 服务器不区分静态与动态请求,所有请求都走 Go runtime。这意味着即使你把敏感文件误放进了 public/,它也会被直接返回——没有 Nginx 的 location /public/ { deny all; } 这类防护。
因此,生产部署时,必须用 Nginx/Apache 做反向代理,并显式声明哪些路径是静态的:
location /public/ {
alias /path/to/your/app/public/;
expires 1y;
add_header Cache-Control "public, immutable";
}
location / {
proxy_pass http://127.0.0.1:8089;
# 其他 proxy_set_header...
}- 务必用
alias(不是root)来映射/public/,否则路径拼接会出错 - 不要让 Nginx 尝试服务
/app/或/conf/—— 这些目录应完全禁止外部访问 - 开发时可忽略此层,但上线前必须验证:直接请求
http://prod.example.com/conf/app.conf应返回 404 或 403,而非配置文件内容
路径规划最易被忽略的点:Revel 的 public/ 是 HTTP 语义上的“公开”,不是文件系统语义上的“可读”。你得同时守住两道线——代码里别把敏感文件放进去,部署时再用反向代理堵死任何意外暴露的可能。


















