使用Chi Router的Go Web应用无法提供静态文件服务求助
解决Chi Router静态文件服务404问题
你遇到的核心问题是:当请求/assets/style.css这类路径时,http.FileServer会收到完整的/assets/style.css路径,然后去./assets目录下找assets/style.css文件——显然这个路径不存在,所以返回404。
修正方案
需要用http.StripPrefix把请求路径中的/assets/前缀去掉,再传给文件服务器,让它直接在assets目录下查找对应的文件。修改后的代码如下:
import ( "net/http" "github.com/go-chi/chi/v5" // 如果你用绝对路径的话,还要引入path/filepath和log // "path/filepath" // "log" ) func main() { router := chi.NewRouter() router.Get("/", indexHandler) router.Get("/showExternalProfile", showExternalProfileHandler) router.Post("/project_request", projectRequestHandler) router.Post("/downloadExternalProfile", downloadExternalProfileHandler) router.Post("/aigenerateProfile", aibeautifyHandler) router.Post("/project_clear", clearHandler) // 关键修正:用StripPrefix去掉/assets/前缀 router.Handle("/assets/*", http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets")))) // 可选:用绝对路径避免工作目录问题 // assetsDir, err := filepath.Abs("./assets") // if err != nil { // log.Fatal(err) // } // router.Handle("/assets/*", http.StripPrefix("/assets/", http.FileServer(http.Dir(assetsDir)))) http.ListenAndServe(":8000", router) }
额外说明
- 如果你是在项目根目录运行程序(比如
go run cmd/main.go),./assets的相对路径是正确的;但如果是进入cmd目录运行(cd cmd && go run main.go),则需要把http.Dir的参数改成../assets。 - 用绝对路径的方式(注释里的代码)可以彻底避免工作目录带来的问题,推荐在生产环境使用。
内容的提问来源于stack exchange,提问作者Sebi
相关产品推荐
相关产品推荐

