6

ソース コードgotoを読んでいたところ、 goto/talk/0/main.goで以下のコードを見つけました。

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

コンテキストによると、urlは絶対パスであり、絶対パスのリダイレクトが予期されていました。しかし、golang/http/redirectが言及したように:

Redirecturl へのリダイレクトでリクエストに応答します。これは、リクエスト パスからの相対パスである場合があります。

これは、相対パスのリダイレクトになります。http.Redirect以前に絶対パスのリダイレクトを行ったかどうかはわかりませんが、最近はそうではありません。

では、どうすればgolangで絶対パスをリダイレクトできますか? インターネットで検索しましたが、何も見つかりませんでした。誰か助けてくれませんか? 前もって感謝します。

4

2 に答える 2

9

の golang ドキュメントにアクセスするとhttp.Redirect、実際には青色のヘッダーをクリックできます。

funcリダイレクト

自明のソース コード リストが表示されます。

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

このトリックは、他の関数にも適用されます。

于 2013-09-26T14:02:12.653 に答える
4

最終的に、絶対パス リダイレクトを実行するには、またはurlなどの完全な URL である必要があることがわかりましたが、 ではありません。http://www.stackoverflow.comhttps://github.comwww.stackoverflow.com

于 2012-08-13T12:34:19.307 に答える