Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menyesuaikan Pengendalian Ralat 404 untuk Pelayan Fail Go Statik?
Memperibadikan Fail Tidak Ditemui Pengendalian dalam Pelayan Fail Statik Go
Apabila menyiarkan fail statik dalam Go menggunakan http.FileServer(), biasanya fail tidak ditemui kembalikan kod status 404. Untuk menyesuaikan tingkah laku ini dan menyediakan halaman tertentu sebaliknya, kami perlu membalut pengendali http.FileServer().
Mencipta Pembalut Pengendali HTTP Tersuai
Kami mencipta pembungkus http.ResponseWriter tersuai (NotFoundRedirectRespWr) untuk memintas kod status yang dikembalikan oleh pengendali pelayan fail. Apabila status adalah 404, kami menghalang respons daripada dihantar dan mengubah hala permintaan ke halaman tertentu (dalam kes ini, /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>
Membungkus Pengendali Pelayan Fail
Seterusnya, kami membalut pengendali http.FileServer() menggunakan fungsi wrapHandler tersuai kami. Fungsi ini menambahkan penulis respons tersuai kami pada rantai pengendali. Jika status respons ialah 404, kami mengubah hala ke /index.html.
<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>
Penggunaan
Untuk menggunakan pengendali tersuai kami, kami menggantikan http.FileServer asal () pengendali dengan pengendali berbalut kami dalam fungsi utama kami:
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }</code>
Kini, sebarang fail yang tidak ditemui akan mencetuskan pengendali tersuai kami dan mengubah hala ke /index.html. Ini memberikan pengalaman yang lebih mesra pengguna untuk aplikasi web satu halaman.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyesuaikan Pengendalian Ralat 404 untuk Pelayan Fail Go Statik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!