【基于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)
相关推荐
狗头大军之江苏分军2 小时前
《潮水漫过十七岁》开学了
后端
苏三说技术2 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong2 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno7043 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc3 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae4 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
参.商.4 小时前
【Day 53】76. 最小覆盖子串
leetcode·golang
计算机魔术师4 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen4 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒5 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端