美文网首页
记一个 net/url 包自动解码 path 而产生的 bug

记一个 net/url 包自动解码 path 而产生的 bug

作者: beiciye | 来源:发表于2017-06-23 13:51 被阅读0次

前端商品详情页存在这个的链接 https://m.ezbuy.sg/product/http%3A%2F%2Fcastleblack.sg%3Fid%3D153553%26_ezgpid%3D153553%26ezbuy%3Dezbuy

这也是符合 url 的标准协议的

然而在 go 里面

func handle(w http.ResponseWriter, r *http.Request) {

println(r.URL.Path)

}

输出的是 /product/http://castleblack.sg?id=153553&_ezgpid=153553&ezbuy=ezbuy

也就是,Request 中的 path 会被自动解码返回

翻开 url.go 查看源码, 的确找到了去做解码的代码

url.Path,err=unescape(rest, encodePath); err!=nil{

goto Error

}

这样拿到到 path 都是经过处理过的,如果需要拿到原始的 url 的话

可以用 url.RawPath, 但是这个属性也是不可靠的,因为它会去判断这个原来的 path 是不是 encode 过,如果 encode 过, 就会返回原始path, 如果没有,就回返回一个空的字符串

所以要准确的拿到原始的 path,可以这样做

path := r.URL.RawPath

if path == "" {

path = r.URL.Path

}

相关文章

网友评论

      本文标题:记一个 net/url 包自动解码 path 而产生的 bug

      本文链接:https://www.haomeiwen.com/subject/mvcclttx.html