全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang实现HTTP重定向处理_自动跟随Location

Go 的 http.Client 默认自动跟随 HTTP 3xx 重定向(最多 10 次),可通过设置 CheckRedirect 字段自定义行为:设为 nil 或返回 http.ErrUseLastResponse 可禁用;实现函数可限制次数、校验域名、记录路径;禁用后亦可手动解析 Location 头发起新请求。

Go 的 http.Client 默认会自动跟随 HTTP 3xx 重定向(如 301、302、307、308),无需额外代码。但若需自定义行为(如限制跳转次数、记录跳转路径、禁用自动跳转或手动处理 Location),则需调整 Client.CheckRedirect 字段。

默认行为:自动跟随重定向

标准 http.Gethttp.DefaultClient.Do 已启用自动跳转,最多 10 次(由 http.DefaultClient.CheckRedirect 控制)。例如:

resp, err := http.Get("https://httpbin.org/redirect/3")
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode) // 输出 200(已自动跳完3次)

禁用自动重定向

CheckRedirect 设为 nil 或返回 http.ErrUseLastResponse 即可终止跳转,直接返回首次响应:

  • 方式一(设为 nil):
client := &http.Client{
    CheckRedirect: nil, // 禁用重定向
}
resp, err := client.Get("https://httpbin.org/redirect/1")
// resp.StatusCode == 302,Body 包含原始响应内容
  • 方式二(显式拒绝):
client := &http.Client{
    CheckRedirect: func(req *http.Request, via []*http.Request) error {
        return http.ErrUseLastResponse // 返回此错误即停止跳转
    },
}

自定义重定向逻辑

通过实现 CheckRedirect 函数,可控制跳转条件。常见用途包括:

  • 限制最大跳转次数(默认是 10,可改为 3)
  • 只允许同域跳转(防止跳到恶意站点)
  • 打印每次跳转的 URL 和状态码
  • 根据响应头或 body 决定是否继续
var redirectLog []string
client := &http.Client{
    CheckRedirect: func(req *http.Request, via []*http.Request) error {
        if len(via) >= 3 {
            return fmt.Errorf("stopped after 3 redirects")
        }
        // 记录跳转
        lastResp := via[len(via)-1].Response
        redirectLog = append(redirectLog, fmt.Sprintf("%d → %s", lastResp.StatusCode, req.URL.String()))
        return nil // 继续跳转
    },
}

手动解析并发起重定向请求

若禁用自动跳转后想自行处理(如改用 POST 继续、添加认证头等),可读取 Location 头并构造新请求:

client := &http.Client{CheckRedirect: nil}
resp, _ := client.Get("https://httpbin.org/redirect-to?url=/get&status=302")
defer resp.Body.Close()

if resp.StatusCode >= 300 && resp.StatusCode < 400 {
    if loc := resp.Header.Get("Location"); loc != "" {
        u, _ := url.Parse(loc)
        newReq, _ := http.NewRequest("GET", u.String(), nil)
        newReq.Header.Set("User-Agent", "my-app/1.0")
        finalResp, _ := client.Do(newReq)
        defer finalResp.Body.Close()
        // 处理 finalResp
    }
}

不复杂但容易忽略:重定向时请求方法可能变化(如 302 会把 POST 变成 GET),若需保持方法,应使用 307 或 308 状态码,或手动构造请求。


# go  # golang  # app  # 状态码  # red  # nil  # 并发  # location  # http  # 跳转  # 重定向  # 设为  # 自定义  # 最多  # 若需  # 首次  # 会把  # 可通过  # 亦可 


相关文章: 岳西云建站教程与模板下载_一站式快速建站系统操作指南  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  购物网站制作公司有哪些,哪个购物网站比较好?  如何在阿里云ECS服务器部署织梦CMS网站?  开心动漫网站制作软件下载,十分开心动画为何停播?  建站之星云端配置指南:模板选择与SEO优化一键生成  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何通过免费商城建站系统源码自定义网站主题与功能?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  北京企业网站设计制作公司,北京铁路集团官方网站?  已有域名如何免费搭建网站?  如何在建站之星绑定自定义域名?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  香港服务器网站卡顿?如何解决网络延迟与负载问题?  深圳网站制作的公司有哪些,dido官方网站?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  宿州网站制作公司兴策,安徽省低保查询网站?  如何快速搭建安全的FTP站点?  英语简历制作免费网站推荐,如何将简历翻译成英文?  公司门户网站制作流程,华为官网怎么做?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  免费网站制作appp,免费制作app哪个平台好?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  在线制作视频的网站有哪些,电脑如何制作视频短片?  制作企业网站建设方案,怎样建设一个公司网站?  文字头像制作网站推荐软件,醒图能自动配文字吗?  ,石家庄四十八中学官网?  建站之星代理费用多少?最新价格详情介绍  建站之星安装后界面空白如何解决?  如何快速生成高效建站系统源代码?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  如何在阿里云部署织梦网站?  南宁网站建设制作定制,南宁网站建设可以定制吗?  如何在宝塔面板中创建新站点?  建站之星客服服务时间及联系方式如何?  建站主机是什么?如何选择适合的建站主机?  Android滚轮选择时间控件使用详解  如何在搬瓦工VPS快速搭建网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  建站三合一如何选?哪家性价比更高?  七夕网站制作视频,七夕大促活动怎么报名?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  表情包在线制作网站免费,表情包怎么弄?  C#如何在一个XML文件中查找并替换文本内容  小程序网站制作需要准备什么资料,如何制作小程序?  如何通过网站建站时间优化SEO与用户体验?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。