http.fileserver本身只是文件读取器,非开箱即用web服务器;404主因是url路径、路由前缀与磁盘目录三者未严格对齐,需用stripprefix剥离前缀、filepath.abs或os.dirfs确保路径安全,并手动实现spa fallback及index.html自动返回。

直接用 http.FileServer 启动服务不会自动处理根路径、不找 index.html、不设缓存头,也不防路径遍历——它只是个“文件读取器”,不是开箱即用的 Web 服务器。
为什么 http.FileServer 一跑就 404?
根本原因是路径没对齐:URL 路径、注册路由前缀、磁盘目录三者必须严格匹配。漏掉任意一环,比如忘了 http.StripPrefix 或用了相对路径,就会去错地方找文件。
- 请求
/static/js/app.js,但没用http.StripPrefix("/static/", ...)→http.FileServer实际尝试打开./static/static/js/app.js - 代码写
http.Dir("public"),却在cmd/目录下执行go run server.go→ 工作目录是cmd/,public变成cmd/public,而真实资源在项目根目录 - 前缀写成
"/static"(缺末尾/)→/static123也会被 strip,导致路径污染
怎么安全挂载到子路径(如 /assets/)?
必须两步走:先剥离 URL 前缀,再交给 FileServer 查磁盘。顺序不能反,且前缀末尾必须带 /。
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- 用
filepath.Abs("assets")或os.DirFS("assets")构造文件系统(后者更安全,自动拒绝../) - 注册路由时写完整前缀:
http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(os.DirFS("assets")))) - 别用
http.Dir("./assets")——.在部署后不可控;也别用http.Dir("assets\")(Windows 单反斜杠会被转义)
如何支持 SPA fallback 和 index.html 自动返回?
http.FileServer 本身不 fallback。要让 /user/123 这类前端路由返回 index.html,得自己判断文件是否存在。
- 先用
fs.Stat()检查请求路径是否对应真实文件或目录(注意:目录下无index.html时仍会 404) - 若不存在,且路径不含点(
.)、不是 API 路径(如/api/),再手动读取并返回index.html - 别用
http.ServeFile(w, r, "index.html")直接兜底——它会强制加Content-Disposition,破坏 SPA 渲染 - 返回
index.html时务必手动设置w.Header().Set("Content-Type", "text/html; charset=utf-8")
生产环境上线前必须检查的三件事
很多问题只在部署后暴露:权限不对、路径失效、头缺失。本地能跑 ≠ 上线可用。
- 确认进程对静态目录有读权限:
stat ./dist看是否显示Access: (0755/drwxr-xr-x);Linux 下还可能被 SELinux 拦截 - 禁用目录列表:确保目标目录下没有
index.html且不主动包装可列目录的FileSystem,否则泄露结构 - 补缓存头:默认响应无
Cache-Control,浏览器每次重拉 JS/CSS;至少给带哈希的资源加public, max-age=31536000
最易被忽略的是路径清理和权限校验——它们不出错时不报任何提示,只默默返回 403 或 404。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










