我无法让这个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
那我在这里做错了什么?
答案 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)