首頁  >  文章  >  後端開發  >  如何自訂Go靜態檔案伺服器的404錯誤處理?

如何自訂Go靜態檔案伺服器的404錯誤處理?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-28 02:09:31881瀏覽

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

自訂Go 靜態檔案伺服器中的找不到檔案處理

使用http.FileServer() 在Go 中提供靜態檔案時,通常會出現未找到的檔案回傳404 狀態碼。要自訂此行為並提供特定頁面,我們需要包裝 http.FileServer() 處理程序。

建立自訂 HTTP 處理程序包裝器

我們建立一個自訂 http.ResponseWriter 包裝器 (NotFoundRedirectRespWr) 來攔截檔案伺服器處理程序傳回的狀態碼。當狀態為 404 時,我們阻止發送回應並將請求重定向到指定頁面(在本例中為 /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>

包裝檔案伺服器處理程式

接下來,我們使用自訂的 wrapHandler 函數包裝 http.FileServer() 處理程序。此函數將我們的自訂響應編寫器新增至處理程序鏈中。如果回應狀態為 404,我們重定向到 /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>

用法

要使用我們的自訂處理程序,我們取代原來的http.FileServer () 處理程序與我們的主函數中的包裝處理程序:

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

現在,任何未找到的檔案都會觸發我們的自訂處理程序並重定向到/index.html。這為單頁 Web 應用程式提供了更用戶友好的體驗。

以上是如何自訂Go靜態檔案伺服器的404錯誤處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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