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
Libérer: 2024-10-28 02:09:31
original
959 Les gens l'ont consulté

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

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

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

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!

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