在 go/mux 中的第一个匹配后停止匹配

Stop matching after first match in go/mux

我有以下路由器:

func testHttp() {

    r := mux.NewRouter()
    s := r.PathPrefix("/cmd").Subrouter()
    s.HandleFunc("/{cmd}", cmd)
    http.Handle("/", r)

    http.ListenAndServe(":8090", nil)
}

当我发出诸如 localhost:8090/cmd/ls -la 之类的请求时,cmd 处理程序会正确执行。但是,如果我传入 localhost:8090/cmd/ls -la /home/foo 之类的内容,我会得到 404。这意味着 gorilla/mux 在检测到 / 时会保持匹配。那么我该如何配置它,使特定匹配路径(在本例中为 /cmd/)之后的所有内容都被视为路径的参数?大概我可以求助于使用 GET 参数,但是如果也使用 /rest-endpoint/params-containing/ 可以实现吗?

/ 是 URL 的目录分隔符,所以 mux 所做的是正确的,它分隔和匹配由 / 分隔的段。如果要将 ls -la /home/foo 作为路径参数传递,则应转义 / 字符,并写入 %2F。然后 mux 将 运行 正确。

另一种选择是将处理程序安装到 PathPrefix /cmd/。然后你必须在你的处理程序中解析路径的剩余部分,但你可以按照你想要的方式处理'/'。