Google 致力于为黑人社区推动种族平等。查看具体举措

如何处理重定向

某些编程语言具有需要对重定向进行特殊处理的 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标志与任何命令行呼叫。