Apabila menggunakan kaedah FileServer untuk menyampaikan fail statik daripada direktori tempatan, semua aset dihidupkan laluan akar dilayan dengan betul. Contohnya, index.html dan style.css dihidangkan tanpa sebarang isu untuk permintaan ke myserverurl/index.html dan myserverurl/styles.css. Walau bagaimanapun, jika permintaan dibuat ke laluan yang tiada fail yang sepadan, ralat 404 dikembalikan.
Untuk menyampaikan index.html bagi semua laluan tersebut dan memaparkan skrin yang sesuai, pengendali tersuai boleh dicipta yang membalut pengendali FileServer.
Pengendali pembalut mencipta http.ResponseWriter pembalut yang dihantar kepada pengendali FileServer. Penulis respons pembungkus ini memeriksa kod status. Jika ia mendapati bahawa kod status ialah 404, ia tidak menghantar respons kepada pelanggan. Sebaliknya, ia menghantar ubah hala ke /index.html.
Berikut ialah contoh cara pembungkus http.ResponseWriter mungkin kelihatan seperti:
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 }
Pengendali FileServer dibalut menggunakan pembungkus ini :
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) } } }
Pengendali yang dibungkus kemudiannya didaftarkan untuk menyampaikan permintaan:
func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }
Percubaan untuk menanyakan fail yang tidak wujud seperti /a.txt3 atau favicon.ico, akan mengakibatkan ralat 404 dan permintaan dialihkan ke /index.html.
Atas ialah kandungan terperinci Bagaimana untuk Mengalihkan Ralat 404 ke Index.html dalam Pelayan Fail Go Statik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!