89 votes

Affichage de la page d'erreur personnalisée 404 avec le package http standard

En supposant que nous ayons :

L'utilisateur voit une simple "page 404 introuvable" lorsqu'il essaie une mauvaise URL. Comment puis-je retourner une page personnalisée pour ce cas ?

Mise à jour concernant le gorille/mux

La réponse acceptée est ok pour ceux qui utilisent net pur / paquet http.

Si vous utilisez gorille / mux vous devriez utiliser quelque chose comme ceci:

Et implémenter `` comme vous voulez.

88voto

Mostafa Points 7468

J'ai l'habitude de faire ceci:

Ici, j'ai simplifié le code pour afficher uniquement la coutume 404, mais je fais en fait plus avec cette configuration: je gère toutes les erreurs HTTP avec `` , dans lequel je vous connecte des informations utiles et envoyer des e-mails à moi-même.

8voto

zelda Points 8

Voici l'approche que j'ai choisie. Il est basé sur un extrait de code que je ne reconnais depuis que j'ai perdu le favori du navigateur.

Exemple de code : (je l'ai mis dans mon paquet principal)

type hijack404 struct {
    http.ResponseWriter
    R *http.Request
    Handle404 func (w http.ResponseWriter, r *http.Request) bool
}

func (h *hijack404) WriteHeader(code int) {
    if 404 == code && h.Handle404(h.ResponseWriter, h.R) {
        panic(h)
    }

    h.ResponseWriter.WriteHeader(code)
}

func Handle404(handler http.Handler, handle404 func (w http.ResponseWriter, r *http.Request) bool) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
        hijack := &hijack404{ ResponseWriter:w, R: r, Handle404: handle404 }

        defer func() {
            if p:=recover(); p!=nil {
                if p==hijack {
                    return
                }
                panic(p)
            }
        }()

        handler.ServeHTTP(hijack, r)
    })
}

func fire404(res http.ResponseWriter, req *http.Request) bool{
    fmt.Fprintf(res, "File not found. Please check to see if your URL is correct.");

    return true;
}

func main(){
    handler_statics := http.StripPrefix("/static/", http.FileServer(http.Dir("/Path_To_My_Static_Files")));

    var v_blessed_handler_statics http.Handler = Handle404(handler_statics, fire404);

    http.Handle("/static/", v_blessed_handler_statics);

    // add other handlers using http.Handle() as necessary

    if err := http.ListenAndServe(":8080", nil); err != nil{
        log.Fatal("ListenAndServe: ", err);
    }
}

Veuillez personnaliser l' func fire404 à la sortie de votre propre version de message d'erreur 404.

Si vous arrive d'être en utilisant Gorille Mux, vous pouvez remplacer la fonction main avec ci-dessous :

func main(){
    handler_statics := http.StripPrefix("/static/", http.FileServer(http.Dir("/Path_To_My_Static_Files")));

    var v_blessed_handler_statics http.Handler = Handle404(handler_statics, fire404);

    r := mux.NewRouter();
    r.PathPrefix("/static/").Handler(v_blessed_handler_statics);

    // add other handlers with r.HandleFunc() if necessary...

    http.Handle("/", r);

    log.Fatal(http.ListenAndServe(":8080", nil));
}

Merci de bien vouloir corriger le code, si c'est faux, puisque je ne suis qu'un débutant à l'Aller. Merci.

2voto

Jeremy Wall Points 10643

Il vous suffit de créer votre propre notFound gestionnaire et l'enregistrer avec HandleFunc pour le chemin d'accès que vous n'avez pas à traiter.

Si vous voulez plus de contrôle sur votre logique de routage, vous aurez besoin d'utiliser un serveur personnalisé et personnalisé gestionnaire de type de votre propre.

Cela vous permet de mettre en œuvre plus complexe la logique de routage de la HandleFunc vous permettront de le faire.

2voto

zserge Points 1063

Peut-être que je me trompe, mais je viens de vérifier les sources: http://golang.org/src/pkg/net/http/server.go

Il semble que spécifiant des NotFound() la fonction n'est guère possible: NotFoundHandler() renvoie une codé en dur fonction appelée NotFound().

Probablement, vous devez soumettre une question sur cette.

Comme solution de contournement, vous pouvez utiliser votre "/" gestionnaire, qui est une solution de secours si pas d'autres maîtres-chiens ont été trouvés (comme c'est le plus court). Donc, vérifiez s'agit de la page existe dans ce gestionnaire et de retourner une erreur 404 personnalisée.

0voto

Atom Points 8739

Je ne suis pas sûr de ce que vous demandez. Ma réponse n'est qu'une supposition.

Il ya une différence si le modèle se termine `` avec ou non, alors peut-être que vous avez juste besoin de remplacer ```` par:

Sans la fin de , une URL comme sera servi par la `` fonction (pas par la fonction).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X