Fix embedded frontend serving: use fs.ReadFile instead of Gin FileFromFS
- FileFromFS with http.FS(embedFS) returned 301 redirects due to Gin setting c.Request.URL.Path to a relative path for http.FileServer - Replace with direct fs.ReadFile + Gin c.Data, determining content type via mime.TypeByExtension - Supports all asset types (JS, CSS, SVG, HTML) and SPA fallback
This commit is contained in:
@@ -4,10 +4,12 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
|
"mime"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -59,10 +61,22 @@ func main() {
|
|||||||
subFS, subErr := fs.Sub(embed.Frontend, "dist")
|
subFS, subErr := fs.Sub(embed.Frontend, "dist")
|
||||||
if subErr == nil {
|
if subErr == nil {
|
||||||
if _, err := subFS.Open("index.html"); err == nil {
|
if _, err := subFS.Open("index.html"); err == nil {
|
||||||
r.StaticFS("/assets", http.FS(subFS))
|
|
||||||
r.StaticFileFS("/favicon.ico", "favicon.ico", http.FS(subFS))
|
|
||||||
r.NoRoute(func(c *gin.Context) {
|
r.NoRoute(func(c *gin.Context) {
|
||||||
c.FileFromFS("index.html", http.FS(subFS))
|
path := strings.TrimPrefix(c.Request.URL.Path, "/")
|
||||||
|
if path == "" {
|
||||||
|
path = "index.html"
|
||||||
|
}
|
||||||
|
data, err := fs.ReadFile(subFS, path)
|
||||||
|
if err == nil {
|
||||||
|
ct := mime.TypeByExtension(filepath.Ext(path))
|
||||||
|
if ct == "" {
|
||||||
|
ct = "text/html; charset=utf-8"
|
||||||
|
}
|
||||||
|
c.Data(http.StatusOK, ct, data)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, _ = fs.ReadFile(subFS, "index.html")
|
||||||
|
c.Data(http.StatusOK, "text/html; charset=utf-8", data)
|
||||||
})
|
})
|
||||||
log.Print("serving embedded frontend")
|
log.Print("serving embedded frontend")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user