Buffalo框架不支持SPA路由代理,需在app.NotFoundHandler中手动配置回退至public/index.html以解决刷新404问题,且必须置于所有路由注册之后、避免被中间件拦截。

Buffalo 框架本身不提供 SPA 路由代理(如 Webpack Dev Server 的 devServer.proxy),它默认只处理明确注册的后端路由;若你用 React/Vue 做前端、Buffalo 仅作 API 服务,必须手动配置反向代理或静态文件托管逻辑,否则刷新页面会 404。
buffalo dev 不代理前端路由,得自己接管 404
Buffalo 的 buffalo dev 启动的是 Go HTTP server,它不会自动把未匹配的路径(如 /dashboard、/settings)回退到 index.html。这是 SPA 最常见的 404 根源。
- 默认行为:请求
/api/users→ 匹配到路由,返回 JSON;请求/settings→ 无匹配路由 → 返回 404 - 解决思路不是“加代理”,而是让 Buffalo 在所有未命中路由时,返回
public/index.html(前提是你的前端已构建好并放在public/下) - 关键代码在
actions/app.go的中间件链末尾,加一个兜底 handler:
app.NotFoundHandler = func(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, "/api/") {
w.WriteHeader(404)
w.Write([]byte("Not Found"))
return
}
http.ServeFile(w, r, "public/index.html")
}
注意:public/index.html 必须存在,且路径是相对于项目根目录的——不是 templates/,也不是 assets/。
为什么不用 nginx 或 webpack-dev-server 代理?
因为 Buffalo 的 buffalo dev 已经占了 :3000 端口,而多数前端框架开发服务器(如 npm start)也默认跑在 :3000,端口冲突;更关键的是,Buffalo 生成的 public/ 是静态资源输出目标,不是开发态热更新入口。
- 开发阶段推荐:前端独立跑
npm run dev(监听:5173),Buffalo 只跑 API(:3000),用浏览器插件或本地 hosts 临时绕过跨域 - 生产阶段必须:前端构建产物(
dist/)复制进 Buffalo 的public/目录,并启用上面的NotFoundHandler回退逻辑 - 别在
buffalo dev中试图启动另一个 dev server——它不支持嵌套或 fork 子进程
public/ 目录结构和缓存陷阱
Buffalo 的 buffalo build 只打包 public/ 下的文件进二进制,所以前端构建路径必须对齐,否则上线后 JS/CSS 404。
- 确保前端构建输出路径为
public/(Vue CLI:修改vue.config.js的outputDir: "public";Vite:改build.outDir: "public") - 不要用
public/assets/套娃——Buffalo 默认的 Webpack 模式也输出到public/assets/,但 SPA 模式下应扁平化:JS/CSS/HTML 全在public/根下 - 浏览器可能缓存旧的
index.html,导致新路由不生效;上线后加版本号或禁用 cache-control(开发期可设app.Use(middleware.Static("public", middleware.StaticOptions{Expires: -1})))
真正容易被忽略的是:SPA 回退逻辑必须放在所有其他路由注册之后,且不能被中间件提前拦截——比如 auth.Middleware 若没做路径白名单,会拦住所有 / 开头的未注册路径,导致 NotFoundHandler 根本没机会执行。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











