處理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中文網其他相關文章!