如何使用Gorilla Mux使用正则表达式匹配整个路径

3
我希望能够使用正则表达式来匹配整个路径,而不仅仅是其中一部分。
例如:
/users.*

匹配

/users
/users/bob
/users/bob/repos

目前使用 Mux 的 HandleFunc 函数,您需要匹配多个路径。
/users
/users/{.*}
/users/{.*}/{.*}
...
1个回答

2

我最终编写了自己的自定义匹配函数,并使用了go的正则表达式包。这很容易做到,以下是一个示例:

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

...

muxRouter := mux.NewRouter()

muxRouter.
  Methods("GET", "POST").
  Schemes("https").
  MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
    match, _ := regexp.MatchString("/users.*", r.URL.Path)
    // TODO handle error from regex
    return match
  }).
  HandlerFunc(m.ServeHTTP)

关键是使用:
HandlerFunc(f func(http.ResponseWriter, *http.Request))

而不是:
HandleFunc(path string, f func(http.ResponseWriter, *http.Request))

HandlerFunc 必须在匹配器之后。这将允许你编写自己的自定义匹配函数。

性能
对于我的应用场景,这个表现良好,但如果你想要更好的性能,可以尝试使用预编译的 r, _ := regexp.Compile("p([a-z]+)ch")

你可能需要使用一个带有一个已经存储了预编译正则表达式模式的 f func(http.ResponseWriter, *http.Request) 结构体。

Go 正则表达式示例:
https://gobyexample.com/regular-expressions

开始吧!希望你们会发现这篇文章有帮助。


2
有很多HTTP路由器,它们更安全、更高效。您可以在http://awesome-go.com/#middlewares下找到一个小列表。您的实现存在问题:可能会呈现任意文件(/users/../../../../etc/passwd)。 - T. Claverie
谢谢提供的资源,我会去查看一下。对于我的用例来说,这是一个内部工具,它不提供静态文件,只是匹配传入的路径并调用提供的 ResponseWriter。您能否澄清为什么这个答案不安全?我在我的回答中也提到了性能。 - jlonganecker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接