Gestion des erreurs 404 dans les serveurs de fichiers statiques Go
Lors du traitement de fichiers statiques à l'aide d'un serveur Go, les requêtes de fichiers non trouvées entraînent généralement un message 404 Not Erreur trouvée. Pour personnaliser ce comportement et rediriger les utilisateurs vers une page spécifique, telle que index.html, un gestionnaire personnalisé peut être implémenté.
Création d'un gestionnaire personnalisé
Le serveur de fichiers par défaut Le gestionnaire fourni par la bibliothèque standard Go ne prend pas en charge la personnalisation des erreurs. Pour implémenter un gestionnaire personnalisé, enveloppez-le et surveillez le code d'état de la réponse. Si une erreur 404 est détectée, remplacez la réponse par une redirection.
Voici un exemple d'écrivain de réponse qui inspecte le code d'état :
<code class="go">type NotFoundRedirectRespWr struct { http.ResponseWriter // Embedded http.ResponseWriter status int } func (w *NotFoundRedirectRespWr) WriteHeader(status int) { w.status = status 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 about successful writing }</code>
Encapsulation du gestionnaire de serveur de fichiers
La fonction de gestionnaire enveloppé appelle le gestionnaire d'origine et vérifie le code d'état. S'il s'agit d'un 404, il redirige 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 du gestionnaire personnalisé
Dans la fonction principale, enregistrez le gestionnaire encapsulé à l'URL racine :
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }</code>
Sortie du journal
La tentative d'accès à des fichiers inexistants devrait générer les journaux suivants :
2017/11/14 14:10:21 Redirecting /a.txt3 to /index.html. 2017/11/14 14:10:21 Redirecting /favicon.ico to /index.html.
Remarque : Tous les fichiers non trouvés, y compris favicon.ico, seront redirigés vers index.html. Si cela n'est pas souhaité, vous pouvez ajouter des exceptions si nécessaire.
Exemple de code complet
Visitez Go Playground pour l'exemple de code complet :
[https://go.dev/play/p/51SEMfTIM8s](https://go.dev/play/p/51SEMfTIM8s)
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!