【问题标题】:Gorilla Mux RegexGorilla Mux 正则表达式
【发布时间】:2015-05-11 02:48:18
【问题描述】:

我正在使用来自 Golang Gorilla Toolkit 的 Mux 包作为我的路由。

考虑以下路线:

m.HandleFunc("/admin/install", installHandler).Methods("GET")
m.HandleFunc("/admin/^((?!install).)*$", adminHandler).Methods("GET")
m.HandleFunc("/admin", adminHandler).Methods("GET")

问题在于中间路线的正则表达式 - 它没有被解释,因此该路线将不起作用!

m.HandleFunc("/admin/{^((?!install).)*$}", adminHandler).Methods("GET")

使用 {} 大括号也不起作用。它只是被忽略,并被视为 /admin/

也没有:

m.HandleFunc("/admin/{_dummy:^((?!install).)*$}", adminHandler).Methods("GET")

简而言之,我在这里尝试实现的是首先匹配 /admin/install 路由,然后我想使用正则表达式从下面的路由中排除该确切路由,但它不起作用。

有没有办法在 gorilla mux 包中使用正则表达式?

【问题讨论】:

  • 这不是匹配 gorrila/mux 中路径的语法:[paths] are defined using the format {name} or {name:pattern}gorillatoolkit.org/pkg/mux
  • 嘿,我在看到您的评论之前编辑了帖子,但我当然也用以下两种方式进行了测试:1) 大括号不适用于我的“排除”正则表达式。 2) {_dummy: regex} 也没有
  • Go 正则表达式也不支持这种语法。你不需要排除安装,因为它会被第一个路由匹配。
  • 我在管理处理程序中有一些逻辑,只有在用户登录并且用户在请求上下文中设置时才有效,并且只应该访问服务器,所以这就是我想要的理由例外并排除 /admin/install 路线并包括所有其他路线。 :) 我知道我可以在 admin、handler 中编写自己的代码,但我认为如果这能奏效那就太好了:-)
  • 你选错了答案:[^install] 和“后面不跟安装”不一样。

标签: regex go mux gorilla


【解决方案1】:

实际上可以这样做:

m.HandleFunc(`/{_dummy:admin\/([^install]*).*}`, adminHandler).Methods("GET")

编辑:

作为我对 VonC 上述评论的回答,这里有一个示例 go 应用程序:https://play.golang.org/p/nYWNADK7Sr

在本地电脑上运行它。尝试以下路线:

http://localhost:8080/admin/ - (returns "adminHandler")
http://localhost:8080/admin/something - (returns "adminHandler")
http://localhost:8080/admin/install - (returns "installHandler")

所以是的,VonC,它确实解决了具体问题:

"首先匹配 /admin/install 路由,然后我再匹配那个确切的路由 想从下面的路线中排除”

但它并不意味着 “后面不跟着单词,安装” 是正确的——这只是在 re2 语法范围内可能的替代方法。简单地“忽略”或排除安装这个词,如果它恰好出现在 url 中。

【讨论】:

【解决方案2】:

它不起作用,因为 golang 正则表达式遵循 re2 syntax,它不支持前瞻或后瞻。

您可能需要为/admin/install 定义一个处理程序首先
然后所有其他/admin/xxx 将用于其他路线(即不是/admin/install

其实OP SK84加了in the comments

即使先定义了admin/install,也会执行/admin/。这就是我想要避免的。

我想我需要在管理处理程序中围绕它编写代码 - 简单,但没有它工作时那么漂亮。

【讨论】:

  • 我担心会是这样。太糟糕了! :-) 我想我需要在管理处理程序中围绕它进行编码 - 很容易,但如果它有效的话,它不会那么漂亮。谢谢!顺便说一句...您提出的解决方案的问题是,即使首先定义了 admin/install,/admin/ 也将被执行。这就是我想要避免的。
猜你喜欢
  • 2020-08-19
  • 2020-06-06
  • 2015-12-24
  • 1970-01-01
  • 2014-12-22
  • 2017-06-19
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多