访问 /static/js/app.js 返回 404 的主要原因是未用 http.StripPrefix("/static/", ...) 去除 URL 前缀,导致文件服务器在 ./assets/static/js/app.js 而非 ./assets/js/app.js 查找文件。

Go 的 http.ServeFile 和 http.FileServer 能直接服务静态文件,但默认不支持目录遍历、缓存控制和路径前缀,必须手动包装或配置。
用 http.FileServer 服务静态目录时,为什么访问 /static/js/app.js 返回 404?
常见原因是没正确设置 http.StripPrefix,导致文件服务器收到带前缀的路径(如 /static/js/app.js),却在磁盘上查找 ./static/static/js/app.js。
- 必须用
http.StripPrefix("/static", ...)去掉 URL 前缀,再传给http.FileServer -
http.Dir的路径必须是磁盘上的真实根目录,比如./assets,不是./assets/static - 确保文件权限可读,且 Go 进程工作目录正确(建议用绝对路径或
filepath.Abs校验)
fs := http.FileServer(http.Dir("./assets"))
http.Handle("/static/", http.StripPrefix("/static/", fs))如何让 CSS/JS 自动带上版本哈希,避免浏览器缓存旧资源?
Go 标准库不内置资源哈希功能,需自己生成映射表(如 manifest.json),并在模板中引用哈希后缀路径。
- 构建阶段用脚本生成
manifest.json:{ "main.css": "main.a1b2c3.css" } - 运行时用
http.HandlerFunc查表重写请求路径,或直接在 HTML 模板里调用asset("main.css")函数输出带哈希的 URL - 不要依赖
time.Now().Unix()加 query 参数,CDN 和中间代理可能忽略 query 缓存键
为什么生产环境用 http.FileServer 直接服务静态资源不推荐?
它缺少 gzip 压缩、ETag、Last-Modified、HTTP/2 支持,且每个请求都触发磁盘 stat 操作,性能差。
一个功能强大、性能卓越的企业建站系统。使用静态网页技术大大减轻了服务器负担、加快网页的显示速度、提高搜索引擎推广效果。本系统的特点自定义模块多样化、速度快、占用服务器资源小、扩展性强,能方便快捷地建立您的企业展示平台。简便高效的管理操作从用户使用的角度考虑,对功能的操作方便性进行了设计改造。使用户管理的工作量减小。网站互动数据可导出Word文档,邮件同步发送功能可将互动信息推送到指定邮箱,加快企业
立即学习“go语言免费学习笔记(深入)”;
- 开发阶段够用;上线前应交给 Nginx / Caddy / Cloudflare 处理
- 若必须用 Go 托管,可用第三方包如
github.com/elazarl/go-bindata-assetfs或embed(Go 1.16+)将资源编译进二进制,再用http.FileServer包装embed.FS - 注意
embed.FS不支持热更新,修改文件需重新编译
import _ "embed" //go:embed assets/* var assets embed.FSfs := http.FileServer(http.FS(assets)) http.Handle("/static/", http.StripPrefix("/static/", fs))
嵌入资源后,http.FS 对路径大小写敏感,Windows 下测试通过不代表 Linux 生产环境一定正常;embed 不会递归匹配子目录通配符,assets/**/* 写法无效,必须明确写 assets/* 或分多次 embed。









