我只是无法让这个 NotFoundHandler 工作。我想在每个 get 请求上提供一个静态文件,因为它存在,否则提供 index.html。这是我目前的简化路由器:func fooHandler() http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Foo")) } return http.HandlerFunc(fn)}func notFound(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "public/index.html")}func main() { router = mux.NewRouter() fs := http.FileServer(http.Dir("public")) router.Handle("/foo", fooHandler()) router.PathPrefix("/").Handler(fs) router.NotFoundHandler = http.HandlerFunc(notFound) http.ListenAndServe(":3000", router)}/foo工作正常/file-that-exists工作正常/file-that-doesnt-exist 不起作用 - 我找不到 404 页面而不是 index.html那么我在这里做错了什么?
2 回答
子衿沉夜
TA贡献1828条经验 获得超3个赞
问题是router.PathPrefix("/").Handler(fs)将匹配每条路线并且NotFoundHandler永远不会执行。在NotFoundHandler当路由器不能找到一个匹配的路由时,才会执行。
当您明确定义路由时,它会按预期工作。
你可以这样做:
router.Handle("/foo", fooHandler())
router.PathPrefix("/assets").Handler(fs)
router.HandleFunc("/", index)
router.HandleFunc("/about", about)
router.HandleFunc("/contact", contact)
router.NotFoundHandler = http.HandlerFunc(notFound)
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
这对我有用
r.NotFoundHandler = http.HandlerFunc(NotFound)
确保您的“NotFound”功能具有:
func NotFound(w http.ResponseWriter, r *http.Request) { // a * before http.Request
- 2 回答
- 0 关注
- 230 浏览
添加回答
举报
0/150
提交
取消