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

如何使用Gorilla Mux将整个路径与正则表达式匹配,go,gorilla,Go,Gorilla,我希望能够使用正则表达式来匹配整个路径,而不仅仅是其中的一部分 例如: /users.* 相配 /users /users/bob /users/bob/repos 目前使用Mux的HandleFunc必须匹配多个路径 /users /users/{.*} /users/{.*}/{.*} ... 我最终编写了自己的自定义匹配器函数,并使用了go的正则表达式包。这很容易做到,下面是一个例子: import ( ... "net/http" "net/url" "

我希望能够使用正则表达式来匹配整个路径,而不仅仅是其中的一部分

例如:

/users.*
相配

/users
/users/bob
/users/bob/repos
目前使用Mux的
HandleFunc
必须匹配多个路径

/users
/users/{.*}
/users/{.*}/{.*}
...

我最终编写了自己的自定义匹配器函数,并使用了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(路径字符串,f func(http.ResponseWriter,*http.Request))

HandlerFunc
必须跟在您的匹配者后面。这将允许您编写自己的自定义匹配器函数

性能
对于我的用例来说,这执行得很好,但是如果您想要更好的性能,可以尝试使用预编译的
r,:=regexp.Compile(“p([a-z]+)ch”)

您可能需要将结构与
f func(http.ResponseWriter,*http.Request)
一起使用,该结构中已经存储了预编译正则表达式模式

Go Regex示例:


进城去!希望你们觉得这很有帮助。

我最终编写了自己的自定义匹配器函数,并使用了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(路径字符串,f func(http.ResponseWriter,*http.Request))

HandlerFunc
必须跟在您的匹配者后面。这将允许您编写自己的自定义匹配器函数

性能
对于我的用例来说,这执行得很好,但是如果您想要更好的性能,可以尝试使用预编译的
r,:=regexp.Compile(“p([a-z]+)ch”)

您可能需要将结构与
f func(http.ResponseWriter,*http.Request)
一起使用,该结构中已经存储了预编译正则表达式模式

Go Regex示例:


进城去!希望这对你们有所帮助。

这附近有很多HTTP路由器,它们更安全、更高效。你可以在下面找到一个小列表。您的实现存在问题:可能呈现任意文件(/users/../../../../../../../etc/passwd),感谢您提供的资源,我将对此进行检查。对于我的用例,它是一个内部工具,不提供静态文件,它只是匹配传入路径并调用提供的ResponseWriter。你能澄清为什么这个答案不安全吗?我在回答中也提到了性能。那里有很多HTTP路由器,它们更安全、更高效。你可以在下面找到一个小列表。您的实现存在问题:可能呈现任意文件(/users/../../../../../../../etc/passwd),感谢您提供的资源,我将对此进行检查。对于我的用例,它是一个内部工具,不提供静态文件,它只是匹配传入路径并调用提供的ResponseWriter。你能澄清为什么这个答案不安全吗?我在回答中也提到了绩效。