package main import ( "net/http" "strings" ) // webDir enthält das gebaute React-Frontend (frontend/ -> npm run build): // index.html plus gehashte Dateien unter assets/. const webDir = "web" // serveApp liefert die index.html des Frontends; das Routing übernimmt der // Client. Nur für die Seitenrouten des Frontends registriert (siehe routes) -- // beliebige andere Pfade bleiben ein echtes 404, statt als Seite zu gelten und // in der Impression-Statistik zu landen. no-cache, damit nach einem Deploy // sofort die neue index.html mit den neuen Asset-Namen geladen wird. func serveApp(w http.ResponseWriter, r *http.Request) { w.Header().Set("Cache-Control", "no-cache") http.ServeFile(w, r, webDir+"/index.html") } // serveAssets liefert die gebauten JS/CSS-Dateien. Ihre Namen enthalten einen // Inhalts-Hash, sie ändern sich also nie -> dauerhaft cachebar. Verzeichnisse // gibt es nicht zu sehen (kein Listing). func serveAssets() http.Handler { files := http.FileServer(http.Dir(webDir)) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if strings.HasSuffix(r.URL.Path, "/") { http.NotFound(w, r) return } w.Header().Set("Cache-Control", "public, max-age=31536000, immutable") files.ServeHTTP(w, r) }) }