HTML中引用CSS/JS必须用以/开头的绝对路径,如<link href="/static/css/app.css">,否则浏览器会基于当前页面URL拼接路径导致404;Go中需确保HTML路径前缀与路由pattern完全一致,如r.Static("asset", "asset")对应HTML中写/asset/css/main.css。

HTML 模板里引用 CSS/JS 必须用绝对路径
浏览器解析 <link href="css/app.css"> 时,会按当前页面 URL 基础路径拼接,比如页面在 /user/profile,就会请求 /user/css/app.css——这几乎肯定 404。真正该写的是以 / 开头的绝对路径:<link href="/static/css/app.css">。
常见错误现象:CSS 文件返回状态码 200,但内容是首页 HTML;本质是请求没被静态路由捕获,掉进主 handler(如 http.HandleFunc("/", getHome))里了。
- 禁用所有
../static/、static/这类相对写法 - 确保 HTML 中路径前缀(如
/static/)和 Go 路由注册的 pattern 完全一致 - 如果用 Gin,
r.Static("asset", "asset")对应 HTML 里就得写/asset/css/main.css
net/http 中必须配 http.StripPrefix 才能映射对文件
http.Handle("/static/", http.FileServer(http.Dir("./static"))) 是错的——http.FileServer 收到的请求路径是 /static/css/app.css,它会去 ./static/static/css/app.css 找,显然不存在。
正确做法是先砍掉前缀,再进目录查找:
立即学习“go语言免费学习笔记(深入)”;
fs := http.FileServer(http.Dir("./static"))
http.Handle("/static/", http.StripPrefix("/static/", fs))
关键点:
-
http.StripPrefix第一个参数("/static/")必须和http.Handle的 pattern 完全相同,包括结尾斜杠 -
http.Dir("./static")的"./static"推荐带./,避免因启动位置不同导致路径失效 - 静态路由注册建议放在主路由之前,减少误匹配风险
Gin 框架用 r.Static 时要注意路径挂载逻辑
r.Static("public", "public") 表示:浏览器访问 /public/js/main.js,Gin 就去项目根目录下的 public/js/main.js 读取并返回。
容易踩的坑:
- HTML 中写
/public/js/main.js,但实际文件在assets/js/→ 路径不一致,404 - 调用
r.Static("/a/b/c", "assets/css")后,浏览器请求/a/b/c/style.css,对应磁盘上就是assets/css/style.css,不是assets/css/a/b/c/style.css - 若想让
/css/映射到assets/css,就该写r.Static("/css", "assets/css"),而不是r.Static("css", "assets/css")
用 //go:embed 打包资源时路径不能含 ./ 或变量
Go ≥ 1.16 支持编译期嵌入,但路径写错直接报 pattern matches no files。
正确写法示例:
//go:embed ui/**var assets embed.FS
然后用 fs.ReadFile(assets, "ui/index.html") 读取——注意:嵌入路径(ui/**)和读取路径("ui/index.html")必须对齐。
常见陷阱:
-
//go:embed ./ui/*→ 报错,./不允许 - 嵌入
ui/**,却写fs.ReadFile(assets, "index.html")→ 找不到,漏了ui/前缀 - 用
http.FileServer(http.FS(assets))提供服务,但没做fs.Sub→ 请求/static/app.js会去查app.js,而非ui/static/app.js



















