Go嵌入式静态资源无法加载返回404问题排查求助
问题原因与解决方法
你的问题出在两个关键地方:
- 路由匹配方式错误:
r.Handle("/assets/", ...)只会精确匹配/assets/这个路径,无法匹配/assets/app.js这类子路径,必须换成PathPrefix来匹配所有以/assets/开头的请求。 - 文件路径前缀未剥离:你嵌入的
assets目录下的文件,在embed.FS里的实际路径是assets/app.js,但请求过来的路径是/assets/app.js,直接传给FileServer的话,它会尝试在FS里找/assets/app.js(实际不存在),必须先把请求路径里的/assets/前缀去掉,让FileServer用剩下的app.js去FS里找对应的assets/app.js。
修改后的代码如下:
package main import ( "embed" "fmt" "github.com/gorilla/mux" "log" "net/http" ) //go:embed assets var assets embed.FS func main() { r := mux.NewRouter() // 改用PathPrefix匹配所有/assets/开头的请求,并用StripPrefix去掉前缀 r.PathPrefix("/assets/").Handler(http.StripPrefix("/assets/", http.FileServer(http.FS(assets)))) srv := &http.Server{ Handler: r, Addr: fmt.Sprintf(":%d", 9876), } log.Fatal(srv.ListenAndServe()) }
修改后,访问http://localhost:9876/assets/app.js时,StripPrefix会把请求路径处理成app.js,FileServer就能正确找到嵌入FS里的assets/app.js并返回内容。
内容的提问来源于stack exchange,提问作者Fossmo
相关产品推荐
相关产品推荐

