Dans une application Go, vous exploitez une application Web d'une seule page et servez ses actifs à l'aide d'un fichier statique serveur de fichiers. Bien que le serveur fonctionne bien pour servir les actifs existants dans le répertoire racine, il génère une erreur 404 Not Found si un fichier demandé n'est pas présent.
Votre objectif est de modifier le comportement du serveur pour servir index.html pour tout URL non reconnue. Ceci est crucial car votre application monopage gère le rendu basé sur le HTML et le JavaScript servis.
Le gestionnaire par défaut fourni par http.FileServer() manque d'options de personnalisation, y compris la gestion de 404 réponses introuvables. Pour résoudre cette limitation, nous allons envelopper le gestionnaire et implémenter notre logique dans le wrapper.
Nous allons créer un http.ResponseWriter personnalisé qui encapsule l'original rédacteur de réponses. Cet rédacteur de réponses personnalisées :
Vous trouverez ci-dessous un exemple d'un tel rédacteur de réponse personnalisé :
<code class="go">type NotFoundRedirectRespWr struct { http.ResponseWriter // Embed the base HTTP response writer status int } func (w *NotFoundRedirectRespWr) WriteHeader(status int) { w.status = status // Store the status code if status != http.StatusNotFound { w.ResponseWriter.WriteHeader(status) // Proceed normally for non-404 statuses } } func (w *NotFoundRedirectRespWr) Write(p []byte) (int, error) { if w.status != http.StatusNotFound { return w.ResponseWriter.Write(p) // Proceed normally for non-404 statuses } return len(p), nil // Pretend that the data was successfully written, but discard it }</code>
Ensuite, nous encapsulons le gestionnaire renvoyé par http.FileServer(). Le gestionnaire du wrapper :
Voici un exemple du gestionnaire wrapper :
<code class="go">func wrapHandler(h http.Handler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { nfrw := &NotFoundRedirectRespWr{ResponseWriter: w} h.ServeHTTP(nfrw, r) // Call the default handler with our custom response writer if nfrw.status == 404 { log.Printf("Redirecting %s to index.html.", r.RequestURI) http.Redirect(w, r, "/index.html", http.StatusFound) } } }</code>
Maintenant, dans votre fonction main(), utilisez le gestionnaire wrapper pour modifier le comportement du serveur de fichiers statiques.
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) // Wrap the handler http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) // Start serving files with the custom handler }</code>
Avec cette approche, tous les requêtes vers des URL correspondant à des fichiers inexistants déclencheront une redirection vers index.html. Votre application monopage fonctionnera comme prévu, affichant le contenu approprié en fonction du HTML et du JavaScript servis.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!