diff --git a/backend/cmd/main.go b/backend/cmd/main.go index 9df6393..7ca1927 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -225,23 +225,19 @@ func startServer() { gin.SetMode(gin.ReleaseMode) } - r := gin.Default() + // 使用 gin.New() 而不是 gin.Default(),避免默认中间件 + r := gin.New() r.MaxMultipartMemory = 32 << 20 - r.Use(middleware.Logger()) - r.Use(middleware.Recovery()) - r.Use(middleware.Cors()) - r.Use(gzipMiddleware()) - - r.Use(func(c *gin.Context) { - if strings.HasPrefix(c.Request.URL.Path, "/uploads/") { - c.Header("Cache-Control", "public, max-age=31536000, immutable") - } - c.Next() - }) - - // 优化的静态文件服务,支持 Range 请求和断点续传 + // 静态文件路由 - 注册在最前面,不经过任何中间件 r.GET("/uploads/*filepath", handleOptimizedStaticFile) + + // 以下中间件只对非 uploads 路径生效 + r.Use(skipUploads(middleware.Logger())) + r.Use(skipUploads(middleware.Recovery())) + r.Use(skipUploads(middleware.Cors())) + r.Use(skipUploads(gzipMiddleware())) + router.SetupRoutes(r) setupEmbeddedFrontend(r) @@ -258,6 +254,17 @@ func startServer() { } } +// skipUploads 包装中间件,跳过 /uploads/ 路径 +func skipUploads(handler gin.HandlerFunc) gin.HandlerFunc { + return func(c *gin.Context) { + if strings.HasPrefix(c.Request.URL.Path, "/uploads/") { + c.Next() + return + } + handler(c) + } +} + func setupEmbeddedFrontend(r *gin.Engine) { distFS, err := fs.Sub(embeddedFiles, "embedded/dist") if err != nil { @@ -386,12 +393,6 @@ func isCompressibleContentType(contentType string) bool { func gzipMiddleware() gin.HandlerFunc { return func(c *gin.Context) { - // 静态文件下载路径跳过 gzip 处理,避免影响下载性能 - if strings.HasPrefix(c.Request.URL.Path, "/uploads/") { - c.Next() - return - } - if !strings.Contains(c.GetHeader("Accept-Encoding"), "gzip") { c.Next() return