【基于GO的Web开发14】gin请求重定向

一、重定向的两种分类

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)
相关推荐
Best_Liu~3 分钟前
SpringBoot全局日期格式化
java·spring boot·后端
小蒜学长7 分钟前
基于Django+Vue喵汪联盟宠物领养系统的设计与实现(代码+数据库+LW)
后端·python·django·宠物领养系统·流程规范化
风骏时光牛马11 分钟前
大模型综合能力多维评测:性能、逻辑与落地表现对比
前端
fly-iot16 分钟前
【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c
开发语言·人工智能·golang
liuchangng18 分钟前
React 19 + Vite 6 实战:从教材 PDF 到 866 词间隔重复单词 App
前端·react.js·pdf·vite·开源项目
FungLeo21 分钟前
成为全栈·Go 后端篇·文章查询与展示投影:安全分页、排序和软删除
golang·go·gorm·分页查询·成为全栈·sql安全
Dwzun32 分钟前
基于SpringBoot3+Vue3的油莎豆种植管理系统
java·前端·vue.js·spring boot·后端·python·计算机网络
小码哥_常6 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮9 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
紧跟先前的步伐9 小时前
Go AI Agent 实战 24|工具系统工程化收尾与阶段验收
人工智能·ai·golang·1024程序员节