在Golang中,重寫404錯誤頁面是一個常見的需求,可以幫助我們提供更友善和個人化的錯誤提示。在本文中,php小編西瓜將向大家介紹如何在Golang中實現404頁面的重寫。我們將使用Gin框架來建立Web應用,並透過自訂中間件來處理404錯誤。透過本文的指導,您將學會如何簡單快速地重寫404頁面,提升使用者體驗。讓我們開始吧!
我仍在學習如何使用 Go 進行 Web 開發,但是當我嘗試建立一個簡單的網站時,我面臨以下困難:
package main import ( "fmt" "html/template" "net/http" ) func main() { fs := http.FileServer(http.Dir("")) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { tmpl, _ := template.ParseFiles("index.html") tmpl.Execute(w, nil) }) /** * This route will return a 404 error */ http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Test page") }) /** * If I replace fs to nil, /test route will be work, but non-existent routes * will be return index.html template (home router) instead 404 error. Why? */ http.ListenAndServe(":80", fs) }
http.FileServer
和 http.HandleFunc
之間有衝突。
例如,當我寫: http.ListenAndServe(":80", nil)
時,所有路由(http.HandleFunc
) 都會工作,但如果我嘗試執行以下操作:
http.ListenAndServe(":80", http.FileServer(http.Dir("")))
#沒有路由有效(除了 http.HandleFunc("/"))
。為什麼?
如何覆寫 404 錯誤頁面?我希望Go 有一個像http.HandleError
這樣的方法,它接受http.ResponseWriter
和http.Request
的接口,但我找不到類似的東西。
檢查 http.ListenAndServe
的文件:
如果 handler
為 nil,則會使用預設處理程序 http.HandleFunc
:
因此,在您的程式碼中,您使用DefaultServeMux
註冊了兩條路由;呼叫http.ListenAndServe(":80", nil)
使用預設處理程序(您新增了路由),因此/test
可以工作(更多資訊如下!)。但是,當您執行http.ListenAndServe(":80", fs)
時,您將傳入一個特定的處理程序(fs
),因此所有請求都會傳送到該處理程序(它將嘗試從本機檔案系統提供檔案)。
從這一點開始,我將假設 http.ListenAndServe(":80", nil)
正在被使用(因為添加處理程序然後不使用它們並沒有真正意義)。
上面提到的ServeMux
所以讓我們檢查一下該文件:
因此,Mux 接收請求並計算出應該呼叫哪個處理程序來處理該請求(請注意,只會呼叫一個處理程序)。匹配基於模式的長度(因此,在您的範例中 /test
比 /
長,因此優先)。這意味著對/test
的請求將觸發fmt.Fprint(w, "測試頁")
,其他所有內容將呼叫載入index.html
的處理程序。需要注意的是,您尚未添加引用fs
的處理程序,因此該處理程序未使用(且程式碼將無法編譯- 使用 http.FileServer 處理自訂 404 頁面
以上是如何在 Golang 中重寫 404的詳細內容。更多資訊請關注PHP中文網其他相關文章!