在大猩猩 mux 路由器上设置 404 NotFound 处理程序

setup 404 NotFound handler on a gorilla mux router

这是我用 Go 语言和 gorilla mux 包编写的一个小型演示网络服务器的代码:

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    fmt.Fprintf(w, "Hi there, I love %s!", vars["username"])
}

func homeHandler(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        errorHandler(w, r, http.StatusNotFound)
        return
    }
    vars := mux.Vars(r)
    fmt.Fprintf(w, "Hi there, I love %s!", vars["username"])
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/help/{username}/", handler)
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}

但我没有找到实现自定义 404 页面的方法。

但是我做不出一个r.HandleFunc("/",...) 但是会太贪心了

NotFoundHandler 设置为 returns 您的自定义 404 页面的处理程序方法。

Router 导出一个 NotFoundHandler 字段,您可以将其设置为自定义处理程序。

r := mux.NewRouter()
r.NotFoundHandler = MyCustom404Handler

有时,您会花费大量时间来构建一堆中间件,这些中间件会执行许多操作,例如记录日志、发送指标等等...而默认的 404 处理程序只是跳过所有中间件。

我能够通过 re-setting 默认的 404 处理程序解决这个问题,如下所示:

router := mux.NewRouter()
router.Use(someMiddleware())
// Re-define the default NotFound handler
router.NotFoundHandler = router.NewRoute().HandlerFunc(http.NotFound).GetHandler()

现在,404 默认处理程序也将通过所有中间件。

r := mux.NewRouter()

h := http.HandlerFunc(NotFound)
r.NotFoundHandler = h
    
func NotFound(w http.ResponseWriter, r *http.Request) {
        
}