Google is committed to advancing racial equity for Black communities. See how.

如何處理重定向

某些編程語言具有需要對重定向進行特殊處理的 HTTP 實現。

為響應 REST API 請求,Nest API 服務器返回重定向。 REST 客戶端檢測到重定向並請求客戶端被重定向到的頁面。某些 HTTP 實現不會將 Authorization 標頭轉發到重定向的 URI,這會導致 401 Unauthorized 錯誤。

例如,假設您請求 foo.com。 foo.com 服務器響應重定向到 bar.com。 Postman 或 Curl 將 Authorization 標頭傳遞給 foo,然後傳遞給 bar。其他 HTTP 實現(例如 Golang 和 Python)不會自動將 Authorization 標頭傳遞給重定向的 URI。

這個怎麼運作

以下序列圖顯示了發生重定向時發生的情況。

重定向序列

為了進行比較,以下是不發生重定向時會發生的情況。

無重定向序列

例子

通常,預測您語言的 HTTP 實現可能不會傳遞 Authorization 標頭是一種很好的編碼實踐。

您的代碼應阻止自動重定向並在添加標頭後進行重定向調用。

例如,在 Go 中,您可以這樣做:

customClient := http.Client {
    CheckRedirect: func(redirRequest *http.Request, via []*http.Request)
    error {
        // Go's http.DefaultClient does not forward headers when a redirect 3xx
        // response is received. Thus, the header (which in this case contains the
        // Authorization token) needs to be passed forward to the redirect
        // destinations.
        redirRequest.Header = req.Header

        // Go's http.DefaultClient allows 10 redirects before returning an
        // an error. We have mimicked this default behavior.s
        if len(via) >= 10 {
            return errors.New("stopped after 10 redirects")
        }
        return nil
    },
}

有關更多示例,請參閱:

存儲重定向的位置

按用戶存儲重定向位置也是一種最佳做法。換句話說,在用戶登錄並收到重定向後,存儲 firebase-apiserver03-tah01-i​​ad01.dapi.production.nest.com:9553/ location 並將所有後續請求直接發送到此 URI。

存儲重定向的位置可以節省時間並防止不必要的服務器負載。

要了解更多有關重定向如何與速率限制,請參見數據速率限制

使用 curl 測試 API

使用 curl >= v7.58 時,您可能會從調用涉及重定向的 API 中收到 401 Unauthorized 錯誤。從 curl v7.58 開始,自定義授權標頭不會轉發到 API 返回的重定向 URL。

考慮到這一點上的捲曲> = v7.58,使用--location-trusted標誌與任何命令行呼叫。