Maison >développement back-end >Golang >Comment puis-je personnaliser la gestion des erreurs 404 pour un serveur de fichiers Go Static ?

Comment puis-je personnaliser la gestion des erreurs 404 pour un serveur de fichiers Go Static ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-28 02:09:31960parcourir

How Can I Customize the 404 Error Handling for a Go Static File Server?

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 := &amp;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!

Déclaration:
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