Skip to content

重定向

在 Gin 中,重定向(Redirect)是指将客户端请求的 URL 地址重定向到另一个 URL。Gin 提供了内置的方法来处理 HTTP 重定向。

1. 基本重定向

使用 c.Redirect() 方法可以实现简单的 HTTP 重定向。c.Redirect() 方法有两个参数:

  • statusCode: HTTP 状态码,例如 301(永久重定向)、302(临时重定向)。
  • location: 要重定向到的目标 URL。

示例:实现基本重定向

go
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	// 设置一个路由,重定向到其他页面
	r.GET("/old-page", func(c *gin.Context) {
		// 301:永久重定向
		c.Redirect(http.StatusMovedPermanently, "/new-page")
	})

	// 设置目标页面
	r.GET("/new-page", func(c *gin.Context) {
		c.String(http.StatusOK, "This is the new page!")
	})

	r.Run(":8080")
}

解释:

  • 访问 /old-page 时,会触发 301 重定向到 /new-page
  • 访问 /new-page 时,会返回 "This is the new page!"。

2. 临时重定向和永久重定向

  • 302 Temporary Redirect(临时重定向): 这个状态码表示请求的资源暂时被转移到其他 URL,浏览器将继续使用原始的 URL 发送后续请求。通常用于短期的 URL 修改。
  • 301 Moved Permanently(永久重定向): 这个状态码表示请求的资源已经被永久移到新的位置。浏览器会记住新的 URL,并在后续请求中直接使用新的 URL。

示例:临时重定向

go
r.GET("/temp-redirect", func(c *gin.Context) {
	// 302:临时重定向
	c.Redirect(http.StatusFound, "/new-page")
})

示例:永久重定向

go
r.GET("/permanent-redirect", func(c *gin.Context) {
	// 301:永久重定向
	c.Redirect(http.StatusMovedPermanently, "/new-page")
})

3. 带参数的重定向

你也可以在重定向的 URL 中携带查询参数。

示例:带查询参数的重定向

go
r.GET("/redirect-with-params", func(c *gin.Context) {
	// 重定向到另一个页面,并携带查询参数
	c.Redirect(http.StatusFound, "/new-page?status=success&code=200")
})

r.GET("/new-page", func(c *gin.Context) {
	status := c.DefaultQuery("status", "unknown")
	code := c.DefaultQuery("code", "000")
	c.String(http.StatusOK, "Status: %s, Code: %s", status, code)
})

在这个例子中,访问 /redirect-with-params 会重定向到 /new-page,并传递 statuscode 查询参数。

4. 使用 c.JSONc.Redirect 实现条件重定向

你还可以在业务逻辑中加入条件判断来控制是否进行重定向。

示例:条件重定向

go
r.GET("/check-login", func(c *gin.Context) {
	// 假设某些条件决定是否需要重定向
	isLoggedIn := false
	if !isLoggedIn {
		// 如果用户未登录,重定向到登录页
		c.Redirect(http.StatusFound, "/login")
		return
	}

	c.String(http.StatusOK, "Welcome to your dashboard!")
})

r.GET("/login", func(c *gin.Context) {
	c.String(http.StatusOK, "Please log in!")
})

5. 重定向到外部 URL

Gin 也可以重定向到外部的 URL。

示例:重定向到外部网站

go
r.GET("/redirect-to-google", func(c *gin.Context) {
	// 重定向到 Google
	c.Redirect(http.StatusFound, "https://www.google.com")
})

6. 在客户端执行重定向

除了服务器端的重定向外,有时你也需要在客户端(例如通过 JavaScript)执行重定向。在 Gin 中,可以通过返回 HTML 页面,并在页面中嵌入 JavaScript 来实现。

示例:HTML 页面中的重定向

go
r.GET("/client-redirect", func(c *gin.Context) {
	// 返回 HTML 页面,并通过 JavaScript 执行客户端重定向
	c.HTML(http.StatusOK, "redirect.html", gin.H{
		"target": "/new-page",
	})
})

redirect.html

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="3; url={{.target}}">
    <title>Redirecting...</title>
</head>
<body>
    <p>You are being redirected. If you are not redirected, click <a href="{{.target}}">here</a>.</p>
</body>
</html>

7. 总结

  • c.Redirect(statusCode, location) 是 Gin 中进行 HTTP 重定向的核心方法。
    • statusCode 可以是 301、302 等 HTTP 状态码。
    • location 是目标 URL,可以是相对路径或者绝对路径。
  • 重定向类型
    • 301: 永久重定向。
    • 302: 临时重定向。
  • 可以将查询参数附加到重定向的 URL 中。
  • 通过 JavaScript 和 HTML 也可以实现客户端重定向。

重定向常用于网站 URL 结构变更、访问权限控制等场景,可以有效引导用户到正确的页面。