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

前端商品详情页存在这个的链接 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)