【问题标题】:how to make an absolute path http redirect in golang如何在golang中进行绝对路径http重定向
【发布时间】:2012-08-09 11:24:53
【问题描述】:

我在看源码goto,在goto/talk/0/main.go找到了下面的代码:

http.Redirect(w, r, url, http.StatusFound)

根据上下文,url 是一个绝对路径,并且需要一个绝对路径重定向。但正如golang/http/redirect 提到的那样:

Redirect 以重定向到 url 的方式回复请求,这可能是相对于请求路径的路径。

结果为相对路径重定向。我不知道http.Redirect 之前是否做过绝对路径重定向,但现在没有。

那么如何在 golang 中进行绝对路径重定向? 我搜索了互联网,但一无所获,有人可以帮助我吗? 提前致谢。

【问题讨论】:

    标签: go


    【解决方案1】:

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

    funcRedirect

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

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

    这个技巧也适用于其他函数。

    【讨论】:

      【解决方案2】:

      我终于发现要进行绝对路径重定向,url必须是完整的url,比如http://www.stackoverflow.com或者https://github.com,而不是www.stackoverflow.com

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 2021-04-05
      • 2021-11-10
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多