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