加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在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所述:

Redirect replies to the request with a redirect to url,which may be a path relative to the request path.

它导致相对路径重定向.我不知道http.Redirect之前是否进行了绝对路径重定向,但现在还没有.

那么如何在golang中进行绝对路径重定向呢?
我搜索了互联网,但没有发现任何人,有人可以帮助我吗?
提前致谢.

解决方法

当您转到 http.Redirect的golang文档时,您实际上可以单击蓝色标题:

func 07001

它将带您进入源代码清单,这是不言自明的:

// 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)
    }
}

这个技巧也适用于其他功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读