重定向与静态资源:Redirect、Static/StaticFS/StaticFile

本章解决什么问题:接口除了返回数据,还常需要把请求“转走”(重定向)或直接“吐文件”(静态资源)。本章讲 c.Redirect 的典型用法,以及 Engine 上三个静态资源方法的粒度区别。

重定向

c.Redirect(code, url) 的签名直观,常见组合:

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

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

	r.GET("/old", func(c *gin.Context) {
		c.Redirect(http.StatusMovedPermanently, "/new") // 301
	})
	r.GET("/new", func(c *gin.Context) {
		c.String(200, "you are here")
	})
	r.GET("/goto", func(c *gin.Context) {
		c.Redirect(http.StatusFound, "https://example.com") // 302
	})

	r.Run(":8080")
}

经验法则:资源永久换了位置用 301(浏览器与搜索引擎会记住新地址),临时跳转、登录后回跳用 302。Gin 的重定向最终也是“状态码 + Location 头”的标准 HTTP 行为。

静态资源

Engine 提供三个静态资源方法(官方文档 gin-gonic.com 的 Serving static files 一节有说明):

  • r.Static("/assets", "./assets"):把 URL 前缀 /assets 映射到本地目录 ./assets,最常用;
  • r.StaticFS("/static", http.Dir("./public")):需要自定义文件系统时使用,例如从 embed.FS 出内容时用 http.FS(embedFS) 包装;
  • r.StaticFile("/favicon.ico", "./assets/favicon.ico"):单文件映射,适合 favicon、robots.txt。
r.Static("/assets", "./assets") // 访问 /assets/a.png -> ./assets/a.png
r.StaticFS("/static", http.Dir("./public"))
r.StaticFile("/favicon.ico", "./assets/favicon.ico")

注意:这三个方法会自动注册对应路由(含内部通配),若再手动注册同前缀的 *path 路由会冲突,规划前缀时避开即可。

与单页应用搭配

前端是 SPA 时,可把构建产物目录交给 Static,再用 r.NoRoute 兜底返回 index.html,让浏览器端路由自行接管刷新场景。这种“静态目录 + API 前缀分离”的布局在下一章学完分组后会更好组织。

关键点

  • c.Redirect(code, url) 的 code 决定语义:301 永久、302 临时。
  • Static/StaticFS/StaticFile 分别是“目录前缀 / 自定义文件系统 / 单文件”三种粒度的映射。
  • 静态资源路由本质也是路由,注册前想好前缀,避免与 *path 冲突。

小结

重定向交给 c.Redirect,静态资源交给 Static 家族方法,各自只做一件事。下一章用路由分组把“API 前缀”组织起来。

笔记加载中…