Go语言go:embed结合HTTP Server部署非根路径资源遇404问题
问题解决:将静态文件挂载到/admin/路径后404的处理
当你把挂载路径改为/admin/时,直接使用mux.Handle("/admin/", http.FileServer(http.FS(sub)))会导致FileServer尝试在嵌入的文件系统中查找admin/开头的路径(比如访问/admin/时,会找admin/index.html),但你的文件系统里只有index.html,没有admin目录,所以返回404。
解决方法是使用http.StripPrefix去掉请求路径中的/admin/前缀,再将处理后的路径传给FileServer,这样FileServer就能正确找到对应的静态文件。
修改后的main.go代码如下:
package main import ( "embed" "io/fs" "net/http" ) //go:embed web/dist var webfs embed.FS func main() { mux := http.NewServeMux() sub, err := fs.Sub(webfs, "web/dist") if err != nil { panic(err) } // 使用StripPrefix去掉/admin/前缀,再交给FileServer处理 mux.Handle("/admin/", http.StripPrefix("/admin/", http.FileServer(http.FS(sub)))) http.ListenAndServe(":2222", mux) }
关键说明
http.StripPrefix("/admin/", ...)会将请求路径中的/admin/部分移除,比如访问/admin/时,实际传给FileServer的路径是/,对应文件系统里的index.html;如果有其他静态文件比如/admin/css/style.css,会被处理为/css/style.css,去文件系统中查找对应文件。- 注意挂载路径
/admin/的末尾斜杠不能省略,否则当访问/admin(不带斜杠)时会出现重定向问题,而带斜杠的路径能正确匹配所有以/admin/开头的请求。
内容的提问来源于stack exchange,提问作者user1663023
相关产品推荐
相关产品推荐

