Revel 静态资源必须通过 Static.Serve 路由(GET /assets/*filepath)暴露,而非 http.FileServer 或 http.Handle;URL 路径为 /assets/,对应 app/public/ 目录,需确保 app.conf 中 http.static.enable = true 且 Nginx 正确透传路径。

Revel 框架里静态资源不能直接用 http.FileServer 暴露,否则压缩、ETag、缓存控制等中间件全部失效——这是最常被卡住的地方。
静态资源 URL 路径是 /assets/,不是 /public/
Revel 默认把 app/public/ 目录映射到 URL 的 /assets/ 前缀,不是 /public/。比如你放了 app/public/js/main.js,访问地址必须是 http://localhost:9000/assets/js/main.js,写成 /public/js/main.js 会 404。
- 检查
conf/app.conf是否禁用了服务:http.static.enable = true(默认为 true,但若手动设成false或http.static.dir = ""就会关掉) - 模板中引用必须写成:
<script src="/assets/js/main.js"></script>,硬写/public/是无效的 - 开发时改了
public/下的 JS 或 CSS,Revel 不会自动重载——浏览器需手动刷新,热重载只监听app/和conf/
必须用路由接管,不能用 http.Handle
在 app/init.go 里写 http.Handle("/public/", ...) 或类似代码,会让请求绕过 Revel 生命周期,所有 filter(包括压缩、缓存头、版本注入)都失效。
- 正确做法:在
conf/routes文件末尾加这一行:GET /assets/*filepath Static.Serve - 这条路由让 Revel 自带的
Static.Serve控制器处理请求,从而保留完整的中间件链 - 该路由必须放在
routes靠后位置,避免被前面的通配路由(如* / catchall)拦截 - 若想换静态根目录(比如改成
assets以外的路径),需在app.conf中配置:static.dir = assets(注意:这个static.dir是文件系统路径,不是 URL 路径)
Nginx 反向代理时 /assets/ 路径别被截断
如果部署在子路径下(如 https://example.com/myapp/),Nginx 的 location 配置容易吃掉 /assets/ 前缀,导致 Revel 收不到完整路径。
- 错误写法(会丢掉
/assets/):location /myapp/ { proxy_pass http://127.0.0.1:8089/; } - 正确写法(保留原始路径):
location /myapp/ { proxy_pass http://127.0.0.1:8089/; proxy_redirect off; },并确保app.conf中设置了app.path = /myapp - 更稳妥的做法:让 Nginx 直接本地服务
/assets/请求,不转发给 Revel,避免路径透传风险
最容易被忽略的是:静态资源是否真走的是 Revel 的 Static.Serve,而不是被 Nginx、http.FileServer 或其他 handler 拦截了——只要绕过路由,所有框架级优化(压缩、ETag、版本参数注入)就全没了。











