一、重定向的两种分类
Gin 的重定向分为 外部重定向(跳转至其他服务器) 和 内部路由重定向(项目内路由转发) ; 从 HTTP 状态码上又分为:临时重定向、永久重定向
表格
| 类型 | 状态码 | 常量 | 特点 | 使用场景 |
|---|---|---|---|---|
| 永久重定向 | 301 | http.StatusMovedPermanently |
浏览器会缓存跳转记录 | 线上正式、永久变更的网址⚠️本地开发禁止优先使用!缓存坑极多 |
| 临时重定向 | 302 | http.StatusFound |
浏览器不会缓存跳转 | 本地测试、临时跳转、项目调试(推荐) |
💡踩坑提醒:301 永久重定向一旦访问成功,浏览器就会缓存跳转关系。即使后端代码修改跳转地址,浏览器依旧会跳转到旧地址!开发调试优先选用
302临时重定向。
二、外部重定向(跳转到别的服务器)
使用
c.Redirect(),可以跳转到项目以外的网址,支持 http/https 外链
示例代码‑永久重定向 (301)
Go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/index", func(c *gin.Context) {
// 跳转到外部站点 - 永久重定向 301
c.Redirect(http.StatusMovedPermanently, "https://www.lamprippledream.wiki")
})
r.Run(":8080")
}
开发调试推荐写法‑临时重定向 (302)
Go
//302临时跳转,无浏览器缓存,本地调试首选
c.Redirect(http.StatusFound, "https://www.lamprippledream.wiki")
📌踩坑实战:跳转外链时必须注意协议头
http://和https://! 如果目标网站开启了 HTTPS,代码填写http://就有可能跳转失败、运营商网关返回 404。
三、内部路由重定向(项目内跳转,不发起新 HTTP 请求)
特点:浏览器 URL 地址栏不会发生变化 ,属于服务器内部转发,不会向浏览器返回 301/302 响应。 原理:修改当前请求的 URI 路径,再调用
r.HandleContext(c),让 Gin 继续匹配新路由,完成内部转发。
Go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
//外部跳转示例
r.GET("/index", func(c *gin.Context) {
c.Redirect(http.StatusFound, "https://www.sogo.com")
})
//访问 /a,内部转发到 /b
r.GET("/a", func(c *gin.Context) {
// 修改请求访问路径
c.Request.URL.Path = "/b"
// 使用修改后的上下文,继续匹配路由
r.HandleContext(c)
})
r.GET("/b", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "成功访问路由b",
})
})
r.Run(":8080")
}
访问测试
- 请求
http://127.0.0.1:8080/a - 浏览器地址栏仍然显示
/a,服务器内部转发,返回路由/b的数据
四、外部重定向 VS 内部路由重定向对比
表格
| 对比项 | c.Redirect () 外部重定向 | r.HandleContext () 内部转发 |
|---|---|---|
| 浏览器地址栏 | 地址发生改变 | 地址保持原样不变 |
| 网络请求 | 发起一次全新 HTTP 请求 | 服务器内部转发,无新请求 |
| 跳转范围 | 可以跳转到外部网站、本项目路由 | 仅支持本项目内部路由 |
| HTTP 响应码 | 返回 301/302 | 返回目标接口的状态码(如 200) |