如何使用Golang实现Web请求重定向_处理301和302跳转
发布时间 - 2026-01-01 00:00:00 点击率:次Go 的 net/http 默认自动处理 301/302 重定向(最多 10 次),可通过配置 http.Client 的 CheckRedirect 字段手动控制:设为 nil 或返回 http.ErrUseLastResponse 可禁用自动跳转并获取原始 3xx 响应;在回调中可审计路径、限制域名、添加请求头;完整跳转链需结合禁用重定向与循环请求实现。
Go 的 net/http 默认会自动处理 301/302 重定向(最多 10 次),但有时你需要手动控制跳转逻辑、查看中间响应、或禁用自动重定向。关键在于配置 http.Client 的 CheckRedirect 字段。
默认行为:自
动跟随跳转
不额外配置时,http.Get 或 http.Do 会自动处理 3xx 响应,并返回最终目标的响应体:
resp, err := http.Get("https://httpbin.org/redirect/1")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// resp.StatusCode 是 200(最终页面),不是 302
禁用自动重定向
将 CheckRedirect 设为 nil 或返回 http.ErrUseLastResponse,即可保留原始跳转响应:
- 方法一:设为
nil
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse // 停止重定向,返回 301/302 响应
},
}
resp, err := client.Get("https://httpbin.org/redirect-to?url=https://httpbin.org/get")
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.StatusCode) // 输出 302
fmt.Println(resp.Header.Get("Location")) // 输出重定向目标地址
自定义跳转逻辑(如记录路径、限制次数、改写请求头)
在 CheckRedirect 回调中可访问每次跳转的请求和历史路径,适合审计、调试或条件跳转:
- 打印每次跳转的 URL 和状态码
- 只允许跳转到同一域名下(防止开放重定向)
- 添加统一 User-Agent 或 Authorization 头
var redirectLog []string
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
redirectLog = append(redirectLog, fmt.Sprintf("%d → %s", via[len(via)-1].Response.StatusCode, req.URL.String()))
// 示例:只允许同域跳转
if req.URL.Hostname() != "httpbin.org" {
return fmt.Errorf("redirect to disallowed host: %s", req.URL.Host)
}
// 示例:手动添加请求头(原请求头不会自动继承)
req.Header.Set("X-From-Go-Client", "true")
return nil // 继续跳转
},
}
获取完整跳转链(所有中间响应)
标准 http.Client 不直接暴露中间响应,但可通过自定义 Transport 或分步发起请求实现。更实用的方式是用 CheckRedirect 记录跳转路径,再对每个 URL 单独发 HEAD/GET 请求(注意避免副作用):
- 先用禁用重定向的 client 获取第一个 Location
- 循环请求每个 Location,直到状态码非 3xx
- 每步都检查
resp.Header.Get("Location")
这种方式可控性强,适合爬虫、安全检测或调试重定向环。
# go
# golang
# app
# 爬虫
# 状态码
# red
# 循环
# nil
# location
# http
# 跳转
# 重定向
# 设为
# 最多
# 自定义
# 可通过
# 回调
# 只允许
# 第一个
# 先用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
香港服务器WordPress建站指南:SEO优化与高效部署策略
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
php485函数参数是什么意思_php485各参数详细说明【介绍】
如何自定义建站之星网站的导航菜单样式?
韩国服务器如何优化跨境访问实现高效连接?
网站建设保证美观性,需要考虑的几点问题!
用yum安装MySQLdb模块的步骤方法
Laravel PHP版本要求一览_Laravel各版本环境要求对照
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
如何登录建站主机?访问步骤全解析
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
如何用搬瓦工VPS快速搭建个人网站?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
如何用y主机助手快速搭建网站?
网站建设整体流程解析,建站其实很容易!
如何快速搭建高效服务器建站系统?
linux top下的 minerd 木马清除方法
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
如何在建站之星绑定自定义域名?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
微信小程序 五星评分(包括半颗星评分)实例代码
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Android使用GridView实现日历的简单功能
高端云建站费用究竟需要多少预算?
Laravel如何自定义分页视图?(Pagination示例)
Laravel如何使用withoutEvents方法临时禁用模型事件
EditPlus中的正则表达式 实战(4)
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
如何确认建站备案号应放置的具体位置?
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel怎么在Blade中安全地输出原始HTML内容
进行网站优化必须要坚持的四大原则
如何用花生壳三步快速搭建专属网站?
大连 网站制作,大连天途有线官网?
Laravel怎么实现验证码(Captcha)功能
浅谈Javascript中的Label语句
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何快速上传建站程序避免常见错误?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
Laravel Docker环境搭建教程_Laravel Sail使用指南
WEB开发之注册页面验证码倒计时代码的实现
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】


动跟随跳转