【问题标题】:setup 404 NotFound handler on a gorilla mux router在 gorilla mux 路由器上设置 404 NotFound 处理程序
【发布时间】:2017-09-22 14:58:14
【问题描述】:

这是我用 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("/",...) 但它太贪心了。

【问题讨论】:

标签: go gorilla mux


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      我可以通过像这样重新设置默认的 404 处理程序来解决这个问题:

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

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

      【讨论】:

      • 很酷的解决方案。但是您必须在声明您的真实路线后或使用BuildOnly() 方法进行此分配,以防止该路线像通配符一样。
      • 有效,但是你应该定义这个 NotFoundHandler 注册一旦所有的处理程序都注册了,否则,它将覆盖所有的处理程序
      【解决方案4】:
      r := mux.NewRouter()
      
      h := http.HandlerFunc(NotFound)
      r.NotFoundHandler = h
          
      func NotFound(w http.ResponseWriter, r *http.Request) {
              
      }
      

      【讨论】:

      • 请添加一些关于它的作用的解释
      猜你喜欢
      • 1970-01-01
      • 2016-04-07
      • 2014-12-22
      • 2014-09-08
      • 2015-06-17
      • 1970-01-01
      • 2017-11-07
      • 2020-08-26
      • 1970-01-01
      相关资源
      最近更新 更多