Personnalisation de la gestion des fichiers introuvables dans le serveur de fichiers statiques Go
Lors du traitement de fichiers statiques dans Go à l'aide de http.FileServer(), les fichiers non trouvés sont généralement renvoie un code d'état 404. Pour personnaliser ce comportement et servir une page spécifique à la place, nous devons encapsuler le gestionnaire http.FileServer().
Création d'un wrapper de gestionnaire HTTP personnalisé
Nous créons un wrapper http.ResponseWriter personnalisé (NotFoundRedirectRespWr) pour intercepter le code d'état renvoyé par le gestionnaire du serveur de fichiers. Lorsque le statut est 404, nous empêchons l'envoi de la réponse et redirigeons la demande vers une page spécifiée (dans ce cas, /index.html).
<code class="go">type NotFoundRedirectRespWr struct { http.ResponseWriter // We embed http.ResponseWriter status int } func (w *NotFoundRedirectRespWr) WriteHeader(status int) { w.status = status // Store the status for our own use if status != http.StatusNotFound { w.ResponseWriter.WriteHeader(status) } } func (w *NotFoundRedirectRespWr) Write(p []byte) (int, error) { if w.status != http.StatusNotFound { return w.ResponseWriter.Write(p) } return len(p), nil // Lie that we successfully written it }</code>
Encapsulage du gestionnaire de serveur de fichiers
Ensuite, nous encapsulons le gestionnaire http.FileServer() à l'aide de notre fonction wrapHandler personnalisée. Cette fonction ajoute notre rédacteur de réponses personnalisé à la chaîne de gestionnaires. Si l'état de la réponse est 404, nous redirigeons vers /index.html.
<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) if nfrw.status == 404 { log.Printf("Redirecting %s to index.html.", r.RequestURI) http.Redirect(w, r, "/index.html", http.StatusFound) } } }</code>
Utilisation
Pour utiliser notre gestionnaire personnalisé, nous remplaçons le http.FileServer d'origine () avec notre gestionnaire encapsulé dans notre fonction principale :
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }</code>
Maintenant, tous les fichiers non trouvés déclencheront notre gestionnaire personnalisé et seront redirigés vers /index.html. Cela offre une expérience plus conviviale pour les applications Web d'une seule page.
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!