【问题标题】:How can I send a url-encoded url as a parameter to mux?如何将 url 编码的 url 作为参数发送到 mux?
【发布时间】:2018-08-17 20:30:19
【问题描述】:

我有这个代码

func main() {
  router := mux.NewRouter()
  router.HandleFunc("/", rootHandler)
  router.HandleFunc("/xyz/{url}", urlHandler)
  http.Handle("/", router)

  log.Fatal(http.ListenAndServe(":8080", nil))
}

使用此网址:http://localhost:8080/xyz/https%3A%2F%2Fabc.no%2FJZ2las1o3Ct mux 将重定向(301)到 http://localhost:8080/xyz/https:/abc.no/JZ2las1o3Ct

如果我将 %2F%2F 更改为只有一个 (%2F),我不会被重定向,并且转义字符保持转义。

我找到了对 router.SkipClean(true) 的引用,但 Mux 处理此问题的方式没有区别。

我想要的是 mux 变量url 应该保持https%3A%2F%2Fabc.no%2FJZ2las1o3Ct

【问题讨论】:

  • 您可以使用查询参数而不是动态路径段。
  • 解码url编码参数并在mux中使用它来设置整个url
  • 或者如果你想让它成为一个路径段,你为什么不把它base64编码并解码回来?
  • 你好@vedhavyas 我也说过同样的 url 已经结束编码所以我们只需要解码它。
  • @mkopriva 我正在重写现有服务,所以我无法更改路径

标签: go mux


【解决方案1】:

您可以使用QueryUnescape 删除空格和其他 url 编码参数。 请找function

https://golang.org/pkg/net/url/#QueryUnescape

【讨论】:

  • 如何在多路复用路由器处理之前取消转义 url 路径的一部分?
  • 您可以先解析url并将其用作查询参数,而不是mux处理的url的一部分。您首先通过拆分 url 来对其进行单独转义,然后再使用它。
  • 但是如何在路由器找到命中之前解析 url?路由器的目的是确定哪个函数应该处理路径。
  • 使用多路复用子路由。遇到第二个http时无法拆分字符串然后解析它并在mux中再次附加它
【解决方案2】:

您在这里寻找的是UseEncodedPath 设置。

https://godoc.org/github.com/gorilla/mux#Router.UseEncodedPath

mux 中的默认行为是对 URL 进行解码,然后进行路径匹配。

如果您打开 UseEncodedPath,它不会解码路径参数,当您访问处理程序中的路径参数时,它仍然会被编码。

此时您可以选择是否要使用 go QueryUnescape 函数解码参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多