Umgang mit 404-Fehlern in statischen Go-Dateiservern
Bei der Bereitstellung statischer Dateien über einen Go-Server führen nicht gefundene Dateianfragen normalerweise zu einem 404-Fehler Fehler gefunden. Um dieses Verhalten anzupassen und Benutzer auf eine bestimmte Seite wie index.html umzuleiten, kann ein benutzerdefinierter Handler implementiert werden.
Erstellen eines benutzerdefinierten Handlers
Der Standard-Dateiserver Der von der Go-Standardbibliothek bereitgestellte Handler unterstützt keine Fehleranpassung. Um einen benutzerdefinierten Handler zu implementieren, packen Sie ihn ein und überwachen Sie den Antwortstatuscode. Wenn ein 404-Fehler erkannt wird, ersetzen Sie die Antwort durch eine Weiterleitung.
Hier ist ein Beispiel für einen Antwortschreiber, der den Statuscode überprüft:
<code class="go">type NotFoundRedirectRespWr struct { http.ResponseWriter // Embedded http.ResponseWriter status int } func (w *NotFoundRedirectRespWr) WriteHeader(status int) { w.status = status 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 about successful writing }</code>
Einschließen des Dateiserver-Handlers
Die Wrapped-Handler-Funktion ruft den ursprünglichen Handler auf und überprüft den Statuscode. Wenn es ein 404 ist, wird zu index.html weitergeleitet.
<code class="go">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) } } }</code>
Verwenden des benutzerdefinierten Handlers
Registrieren Sie in der Hauptfunktion den umschlossenen Handler unter der Stamm-URL :
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }</code>
Protokollausgabe
Der Versuch, auf nicht vorhandene Dateien zuzugreifen, sollte die folgenden Protokolle generieren:
2017/11/14 14:10:21 Redirecting /a.txt3 to /index.html. 2017/11/14 14:10:21 Redirecting /favicon.ico to /index.html.
Hinweis : Alle nicht gefundenen Dateien, einschließlich favicon.ico, werden zu index.html umgeleitet. Wenn dies nicht gewünscht ist, können Sie nach Bedarf Ausnahmen hinzufügen.
Vollständiges Codebeispiel
Das vollständige Codebeispiel finden Sie auf dem Go Playground:
[https://go.dev/play/p/51SEMfTIM8s](https://go.dev/play/p/51SEMfTIM8s)
Das obige ist der detaillierte Inhalt vonWie kann ich 404-Fehlerantworten anpassen und Benutzer auf eine bestimmte Seite in einem statischen Go-Dateiserver umleiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!