在Client的字段中,有一个 CheckRedirect,此字段就是用来控制重定向的函数,如果没有定义此字段的话,将会使用默认的 defaultCheckRedirect 方法。
默认的转发策略是最多转发10次。
在转发的过程中,某一些包含安全信息的Header,比如Authorization、WWW-Authenticate、Cookie等,如果转发是跨域的,那么这些Header不会复制到新的请求中。
http的重定向判断会默认处理以下状态码的请求:
301 (Moved Permanently)
302 (Found)
303 (See Other)
307 (Temporary Redirect)
308 (Permanent Redirect)
301、302和303请求将会改用Get访问新的请求,而307和308会使用原有的请求方式。
那么,我们如何去控制重定向的次数,甚至是禁止重定向呢?这里其实就需要我们自己去实现一个CheckRedirect函数了,首先我们来看看默认的defaultCheckRedirect方法:
func defaultCheckRedirect(req *Request, via []*Request) error {
if len(via) >= 10 {
return errors.New("stopped after 10 redirects")
}
return nil
}
第一个参数req是即将转发的request,第二个参数 via是已经请求过的requests。可以看到其中的逻辑是判断请求过的request数量,大于等于10的时候返回一个error,这也说明默认的最大重定向次数为10次,当此函数返回error时,即是重定向结束的时候。
所以如果需要设置重定向次数,那么复制一份这个函数,修改函数名字和其中if判断的数字,然后在生成Client时设定到Client即可:
client := &http.Client{
CheckRedirect: yourCheckRedirect,
}
或者:
client := &http.Client{}
client.CheckRedirect = yourCheckRedirect
禁止重定向则可以把判断数字修改为0。最好相应地修改errors中提示的信息。
有疑问加站长微信联系(非本文作者)