この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機能しません-index.htmlの代わりに404ページが見つかりません
それで、私はここで何が間違っているのですか?
問題は、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