如何在golang中创建绝对路径http重定向
发布时间:2020-12-16 09:28:24 所属栏目:大数据 来源:网络整理
导读:我正在阅读源代码 goto,我在 goto/talk/0/main.go中找到了以下代码: http.Redirect(w,r,url,http.StatusFound) 根据上下文,url是绝对路径,并且预期绝对路径重定向.但正如golang/http/redirect所述: Redirect replies to the request with a redirect to ur
我正在阅读源代码
goto,我在
goto/talk/0/main.go中找到了以下代码:
http.Redirect(w,r,url,http.StatusFound) 根据上下文,url是绝对路径,并且预期绝对路径重定向.但正如golang/http/redirect所述:
它导致相对路径重定向.我不知道http.Redirect之前是否进行了绝对路径重定向,但现在还没有. 那么如何在golang中进行绝对路径重定向呢? 解决方法
当您转到
http.Redirect 的golang文档时,您实际上可以单击蓝色标题:
它将带您进入源代码清单,这是不言自明的: // Redirect replies to the request with a redirect to url,// which may be a path relative to the request path. func Redirect(w ResponseWriter,r *Request,urlStr string,code int) { if u,err := url.Parse(urlStr); err == nil { // If url was relative,make absolute by // combining with request path. // The browser would probably do this for us,// but doing it ourselves is more reliable. // NOTE(rsc): RFC 2616 says that the Location // line must be an absolute URI,like // "http://www.google.com/redirect/",// not a path like "/redirect/". // Unfortunately,we don't know what to // put in the host name section to get the // client to connect to us again,so we can't // know the right absolute URI to send back. // Because of this problem,no one pays attention // to the RFC; they all send back just a new path. // So do we. oldpath := r.URL.Path if oldpath == "" { // should not happen,but avoid a crash if it does oldpath = "/" } if u.Scheme == "" { // no leading http://server if urlStr == "" || urlStr[0] != '/' { // make relative path absolute olddir,_ := path.Split(oldpath) urlStr = olddir + urlStr } var query string if i := strings.Index(urlStr,"?"); i != -1 { urlStr,query = urlStr[:i],urlStr[i:] } // clean up but preserve trailing slash trailing := strings.HasSuffix(urlStr,"/") urlStr = path.Clean(urlStr) if trailing && !strings.HasSuffix(urlStr,"/") { urlStr += "/" } urlStr += query } } w.Header().Set("Location",urlStr) w.WriteHeader(code) // RFC2616 recommends that a short note "SHOULD" be included in the // response because older user agents may not understand 301/307. // Shouldn't send the response for POST or HEAD; that leaves GET. if r.Method == "GET" { note := "<a href="" + htmlEscape(urlStr) + "">" + statusText[code] + "</a>.n" fmt.Fprintln(w,note) } } 这个技巧也适用于其他功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |