Maison > développement back-end > Golang > Comment puis-je personnaliser les réponses aux erreurs 404 et rediriger les utilisateurs vers une page spécifique d'un serveur de fichiers statique Go ?

Comment puis-je personnaliser les réponses aux erreurs 404 et rediriger les utilisateurs vers une page spécifique d'un serveur de fichiers statique Go ?

Mary-Kate Olsen
Libérer: 2024-10-29 03:41:29
original
626 Les gens l'ont consulté

How can I customize 404 error responses and redirect users to a specific page in a Go static file server?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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.
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal