Go和Gorilla Mux NotFoundHandler无法正常工作

Qll*_*lli 11 go mux gorilla

我只是不能让这个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)
}
Run Code Online (Sandbox Code Playgroud)

/ foo工作正常

/ file-that-exists工作正常

/ file-that-doesnt-exist 不起作用 - 我找不到404页面而不是index.html

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

luk*_*kad 25

问题是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)
Run Code Online (Sandbox Code Playgroud)


小智 5

这对我有用

r.NotFoundHandler = http.HandlerFunc(NotFound)
Run Code Online (Sandbox Code Playgroud)

确保您的“NotFound”函数具有:

func NotFound(w http.ResponseWriter, r *http.Request) { // a * before http.Request
Run Code Online (Sandbox Code Playgroud)