Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menyesuaikan Pengendalian Ralat 404 untuk Pelayan Fail Go Statik?

Bagaimanakah Saya Boleh Menyesuaikan Pengendalian Ralat 404 untuk Pelayan Fail Go Statik?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-28 02:09:31960semak imbas

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

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 := &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>

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn