【发布时间】:2021-11-06 11:20:24
【问题描述】:
正如标题所说,考虑一个 Gin 路由器,我想在其中提供来自所有路由除了一个的静态文件。假设这条路线是/api。第一次尝试可能如下所示:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.StaticFS("/", gin.Dir("static", false))
r.GET("/api/v1/foo", func(c *gin.Context) { c.JSON(200, gin.H{"foo": true}) })
r.Run(":9955")
}
底层的RouterGroup.StaticFS(和Static)使用通配符路径参数连接相对路径:path.Join(relativePath, "/*filepath")。当relativePath 是根路径/ 时,它会恐慌:
恐慌:新路径“/api/v1/foo”中的“/api/v1/foo”与现有前缀“/*filepath”中的现有通配符“/*filepath”冲突
这是由于 Gin 的 http 路由器实现:路由匹配 路径前缀,因此 root 上的通配符将与所有其他路由冲突。可以在here 找到有关此行为的更多详细信息——这是提出此问题的地方。
另一种可能的解决方案是给静态文件路由加前缀,这样就不会和/api冲突:
r.StaticFS("/static", gin.Dir("static", false))
但这也不允许我从根目录提供资产。我怎样才能在根目录上使用通配符或等效项,并且仍然匹配一个特定路径?
【问题讨论】: