Go和Gorilla Mux NotFoundHandler无法正常工作

时间:2014-10-26 13:16:22

标签: 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)
}

/ foo 工作正常

/ file-that-exists 正常运行

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

那我在这里做错了什么?

2 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:3)

这对我有用

Rng.AutoFilter Field:=22, Criteria1:="<>Sheet*", Operator:=xlAnd, Criteria2:=varValue

确保您的'NotFound'功能具有:

r.NotFoundHandler = http.HandlerFunc(NotFound)