为了账号安全,请及时绑定邮箱和手机立即绑定

Go 和 Gorilla Mux NotFoundHandler 不工作

Go 和 Gorilla Mux NotFoundHandler 不工作

Go
慕沐林林 2021-08-23 17:48:21
我只是无法让这个 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 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-08-23
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

这对我有用

r.NotFoundHandler = http.HandlerFunc(NotFound)

确保您的“NotFound”功能具有:

func NotFound(w http.ResponseWriter, r *http.Request) { // a * before http.Request


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信