16

この NotFoundHandler を機能させることができません。静的ファイルが存在する場合はすべての取得要求で静的ファイルを提供したいと思います。それ以外の場合は 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 が機能しない - index.html の代わりに 404 page not found が表示される

それで、私はここで何が間違っていますか?

4

2 に答える 2

35

問題は、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)
于 2014-10-26T13:30:04.423 に答える