【基于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)
相关推荐
qq_4523962314 分钟前
第十一篇:《前端性能优化体系:从加载到交互的全链路》
前端·性能优化·交互
Mh17 分钟前
听说我兄弟喜欢跑车,所以必须安排上
前端·javascript·vue.js
zttbee17 分钟前
vue学习(白话功能版)
前端·vue.js·学习·前端框架
qq_4260039619 分钟前
多语言新增语种全量测试策略
前端·javascript·python·pycharm·自动化
东风破_21 分钟前
博客数据库进阶设计:点赞、收藏、评论、标签与文件表怎么建?
后端·mysql
夕除26 分钟前
redis--009
redis·后端
nicole bai27 分钟前
前端封装el-table及注意点
前端·javascript·vue.js
路多辛31 分钟前
为什么用 Go 写 AI Agent,covo-agent 的选型思考
开发语言·golang·agent·ai编程
晨枫阳36 分钟前
Vue 前端构建工具链完全理解指南
前端·javascript·vue.js