Heim >Backend-Entwicklung >Golang >Wie kann ich die 404-Fehlerbehandlung für einen Go Static File Server anpassen?

Wie kann ich die 404-Fehlerbehandlung für einen Go Static File Server anpassen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 02:09:31960Durchsuche

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

Anpassen der Behandlung nicht gefundener Dateien im statischen Go-Dateiserver

Beim Bereitstellen statischer Dateien in Go mit http.FileServer() werden normalerweise Dateien nicht gefunden Gibt einen 404-Statuscode zurück. Um dieses Verhalten anzupassen und stattdessen eine bestimmte Seite bereitzustellen, müssen wir den http.FileServer()-Handler umschließen.

Erstellen eines benutzerdefinierten HTTP-Handler-Wrappers

Wir erstellen einen Benutzerdefinierter http.ResponseWriter-Wrapper (NotFoundRedirectRespWr), um den vom Dateiserver-Handler zurückgegebenen Statuscode abzufangen. Wenn der Status 404 ist, verhindern wir das Senden der Antwort und leiten die Anfrage auf eine bestimmte Seite um (in diesem Fall /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>

Umschließen des Dateiserver-Handlers

Als nächstes umschließen wir den http.FileServer()-Handler mit unserer benutzerdefinierten wrapHandler-Funktion. Diese Funktion fügt unseren benutzerdefinierten Antwortschreiber zur Handlerkette hinzu. Wenn der Antwortstatus 404 ist, leiten wir zu /index.html weiter.

<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>

Verwendung

Um unseren benutzerdefinierten Handler zu verwenden, ersetzen wir den ursprünglichen http.FileServer ()-Handler mit unserem umschlossenen Handler in unserer Hauptfunktion:

<code class="go">func main() {
    fs := wrapHandler(http.FileServer(http.Dir(".")))
    http.HandleFunc("/", fs)
    panic(http.ListenAndServe(":8080", nil))
}</code>

Jetzt lösen alle nicht gefundenen Dateien unseren benutzerdefinierten Handler aus und leiten zu /index.html weiter. Dies bietet eine benutzerfreundlichere Erfahrung für Single-Page-Webanwendungen.

Das obige ist der detaillierte Inhalt vonWie kann ich die 404-Fehlerbehandlung für einen Go Static File Server anpassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn