Heim  >  Artikel  >  Backend-Entwicklung  >  Wie leite ich 404-Fehler auf Index.html in einem Go Static File Server um?

Wie leite ich 404-Fehler auf Index.html in einem Go Static File Server um?

DDD
DDDOriginal
2024-10-28 05:29:30584Durchsuche

How to Redirect 404 Errors to Index.html in a Go Static File Server?

Wie gehe ich mit einem Fehler wegen fehlender Dateien um, wenn ich einen statischen Dateiserver verwende?

Bei Verwendung der FileServer-Methode zum Bereitstellen statischer Dateien aus einem lokalen Verzeichnis werden alle Assets aktiviert Die Root-Route wird korrekt bedient. Beispielsweise werden index.html und style.css ohne Probleme für Anfragen an myserverurl/index.html und myserverurl/styles.css bereitgestellt. Wenn jedoch eine Anfrage an eine Route gestellt wird, für die es keine entsprechende Datei gibt, wird ein 404-Fehler zurückgegeben.

Um index.html für alle derartigen Routen bereitzustellen und den entsprechenden Bildschirm darzustellen, kann ein benutzerdefinierter Handler verwendet werden erstellt, der den FileServer-Handler umhüllt.

Erstellen des Wrappers

Der Wrapper-Handler erstellt einen Wrapper http.ResponseWriter, der an den FileServer-Handler übergeben wird. Dieser Wrapper-Antwortschreiber prüft den Statuscode. Wenn festgestellt wird, dass der Statuscode 404 ist, wird die Antwort nicht an den Client gesendet. Stattdessen wird eine Weiterleitung an /index.html gesendet.

Hier ist ein Beispiel dafür, wie der Wrapper http.ResponseWriter aussehen könnte:

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
}

Der FileServer-Handler wird mit diesem Wrapper umschlossen :

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

Der umhüllte Handler wird dann für die Bearbeitung von Anfragen registriert:

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

Der Versuch, eine nicht vorhandene Datei wie /a.txt3 oder favicon.ico abzufragen, führt zu ein 404-Fehler und die Anfrage wird an /index.html umgeleitet.

Das obige ist der detaillierte Inhalt vonWie leite ich 404-Fehler auf Index.html in einem Go Static File Server um?. 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