
Go 默认不自动提供静态文件,需显式配置 http.FileServer 并结合 http.StripPrefix 将特定 URL 路径映射到本地目录,才能使 HTML 中的 /assets/js/app.js 等引用正常加载。
go 默认不自动提供静态文件,需显式配置 `http.fileserver` 并结合 `http.stripprefix` 将特定 url 路径映射到本地目录,才能使 html 中的 `/assets/js/app.js` 等引用正常加载。
在 Go 的标准 HTTP 服务器中,http.HandleFunc 仅处理路由逻辑,不会自动解析或提供静态文件(如 JS、CSS、图片)。即使 HTML 文件能通过 http.ServeFile 成功返回,其中 <script src="/js/app.js"></script> 这类路径若未被服务器明确注册为静态资源服务端点,浏览器发起的请求将返回 404。
✅ 正确做法是:为静态资源单独注册一个文件服务处理器,并合理设置 URL 前缀与磁盘路径的映射关系。
✅ 推荐目录结构与配置
建议将静态资源集中存放在 assets/ 目录下(便于维护和安全隔离),例如:
├── assets/ │ ├── js/ │ │ └── app.js │ └── css/ ├── templates/ │ └── index.html └── main.go
✅ Go 服务端代码(main.go)
package main
import (
"net/http"
)
func rootHandler(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "templates/index.html")
}
func main() {
// 主页路由
http.HandleFunc("/", rootHandler)
// 静态资源路由:所有 /assets/ 开头的请求 → 映射到 assets/ 目录
// StripPrefix("/assets/", ...) 移除 URL 前缀,避免文件系统查找时多出 "/assets"
http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets"))))
println("Server starting on :8080...")
http.ListenAndServe(":8080", nil)
}
✅ HTML 中正确引用静态资源
在 templates/index.html 中,必须使用与 http.Handle 注册的路径前缀一致的 URL:
<script src="/assets/js/app.js"></script><link rel="stylesheet" href="/assets/css/style.css"> @@##@@
⚠️ 注意事项:
- ❌ 不要写
src="js/app.js"(相对路径)——浏览器按当前 HTML 所在 URL 解析,而 Go 未注册/js/路由,必然 404; - ❌ 不要将静态文件混在
templates/或项目根目录下直接引用/js/app.js——这需要额外注册http.Handle("/js/", ...),且易引发路径混乱; - ✅
http.StripPrefix是关键:若省略,http.FileServer(http.Dir("assets"))会尝试查找assets/assets/js/app.js,导致失败; - ? 安全提示:切勿使用
http.FileServer(http.Dir("."))暴露整个项目目录,防止敏感文件(如main.go、.env)被意外下载。
✅ 验证是否生效
启动服务后,可直接访问以下地址测试:
-
http://localhost:8080/→ 渲染index.html -
http://localhost:8080/assets/js/app.js→ 应返回 JS 文件内容(状态码 200)
通过以上配置,即可实现简洁、安全、符合生产习惯的静态资源服务方案。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











