记一个 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

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容