重定向与静态资源: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 前缀”组织起来。