首页 > 解决方案 > 如何使用 gorilla mux 实现不区分大小写的 URL 匹配

问题描述

我需要在 gorilla mux 中实现不区分大小写的 URL 匹配,因为它是为内置 mux 完成的

我尝试使用这样的中间件来实现相同的目标

router := mux.NewRouter()
router.Use(srv.GetCaseMiddleware())

//GetCaseMiddleware middleware to make match URL case insensitive
func (srv *Server) GetCaseMiddleware() (w mux.MiddlewareFunc) {
    var middleware mux.MiddlewareFunc = func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            r.URL.Path = strings.ToLower(r.URL.Path)
            next.ServeHTTP(w, r)
        })
    }
    return middleware
}

但是如果 URL 大小写改变它仍然会抛出 404,有没有办法使用 gorilla-mux 来实现它

标签: gogorilla

解决方案


不幸的是,在撰写本文时,中间件函数是gorilla/mux.

Mux 支持向路由器添加中间件,如果找到匹配项,这些中间件将按照添加的顺序执行,包括其子路由器。

我建议您使用您提供的链接中的示例。

例如

func CaselessMatcher(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        r.URL.Path = strings.ToLower(r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

然后,只需包装您的多路复用器。

r := mux.NewRouter()
//...
handler := CaselessMatcher(r)

实际上,IMO 还不错。


推荐阅读