fix(web): serve panel SPA routes from NoRoute (#5536)

* fix(web): serve panel SPA routes from NoRoute

Return the React shell for authenticated panel document routes that are not explicitly registered in Gin, such as /panel/hosts. Keep API, CSRF, static-file, method, and Accept exclusions so API misses remain 404 and auth semantics stay unchanged.

* fix(web): remove unreachable panel path guard

The panel path is always built by appending /panel, so it can never be empty.
Remove the redundant fallback branch without changing SPA routing behavior.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(web): allowlist static-asset extensions in SPA fallback

The blanket path.Ext check rejected any panel route whose last segment contained a dot, which would reintroduce the refresh 404 for a future client route carrying a dotted parameter (version, domain, or email-like value). Restrict the static-asset exclusion to a known, case-insensitive extension allowlist and add predicate regression cases.
This commit is contained in:
w3struk
2026-06-25 00:19:12 +05:00
committed by GitHub
parent 2830f97f50
commit ae9bbdf267
4 changed files with 320 additions and 7 deletions
+5 -1
View File
@@ -264,8 +264,12 @@ func (s *Server) initRouter() (*gin.Engine, error) {
c.JSON(http.StatusOK, gin.H{})
})
// Add a catch-all route to handle undefined paths and return 404
// Let unknown panel document routes fall back to the SPA shell, while every
// non-SPA miss still returns a hard 404.
engine.NoRoute(func(c *gin.Context) {
if s.panel.HandleNoRoutePanelSPA(c) {
return
}
c.AbortWithStatus(http.StatusNotFound)
})