Go 和 Gorilla Mux NotFoundHandler 不工作

我只是无法让这个 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


那么我在这里做错了什么?


慕沐林林
浏览 231回答 2
2回答

子衿沉夜

问题是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)

蝴蝶刀刀

这对我有用r.NotFoundHandler = http.HandlerFunc(NotFound)确保您的“NotFound”功能具有:func NotFound(w http.ResponseWriter, r *http.Request) { // a * before http.Request
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go