首頁 >後端開發 >Golang >如何自訂 404 錯誤回應並將使用者重新導向到 Go 靜態檔案伺服器中的特定頁面?

如何自訂 404 錯誤回應並將使用者重新導向到 Go 靜態檔案伺服器中的特定頁面?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-29 03:41:29661瀏覽

How can I customize 404 error responses and redirect users to a specific page in a Go static file server?

處理Go 靜態檔案伺服器中的404 錯誤

使用Go 伺服器提供靜態檔案時,未找到的檔案要求通常會導致404 Not發現錯誤。若要自訂此行為並將使用者重定向到特定頁面,例如index.html,可以實作自訂處理程序。

建立自訂處理程序

預設檔案伺服器Go標準函式庫提供的handler不支援錯誤自訂。若要實現自訂處理程序,請將其包裝並監視回應狀態代碼。如果偵測到 404 錯誤,請用重定向取代回應。

以下是檢查狀態代碼的範例回應編寫器:

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

包裝檔案伺服器處理程序

包裝的處理程序函數呼叫原始處理程序並檢查狀態代碼。如果是 404,則重定向到 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>

使用自訂處理程序

在main 函數中,在根URL 註冊包裝的處理程序:

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

日誌輸出

嘗試存取不存在的文件應產生以下日誌:

2017/11/14 14:10:21 Redirecting /a.txt3 to /index.html.
2017/11/14 14:10:21 Redirecting /favicon.ico to /index.html.

注意: 所有未找到的文件,包括favicon. ico,都將被重定向到index.html。如果不需要,您可以根據需要新增例外。

完整程式碼範例

造訪Go Playground 取得完整程式碼範例:

[https://go.dev/play/p/51SEMfTIM8s ](https://go.dev/play/p/51SEMfTIM8s)

以上是如何自訂 404 錯誤回應並將使用者重新導向到 Go 靜態檔案伺服器中的特定頁面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn