Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menulis semula 40​​4 dalam Golang

Bagaimana untuk menulis semula 40​​4 dalam Golang

WBOY
WBOYke hadapan
2024-02-08 21:30:191208semak imbas

如何在 Golang 中重写 40​​4

Di Golang, menulis semula halaman ralat 404 ialah keperluan biasa, yang boleh membantu kami memberikan gesaan ralat yang lebih mesra dan diperibadikan. Dalam artikel ini, editor PHP Xigua akan memperkenalkan kepada anda cara menulis semula halaman 404 di Golang. Kami akan menggunakan rangka kerja Gin untuk membina aplikasi web dan mengendalikan ralat 404 melalui perisian tengah tersuai. Melalui panduan artikel ini, anda akan belajar cara menulis semula halaman 404 dengan mudah dan cepat untuk meningkatkan pengalaman pengguna. Mari mulakan!

Kandungan soalan

Saya masih belajar cara menggunakan Go untuk pembangunan web, tetapi apabila saya cuba mencipta tapak web yang mudah, saya menghadapi kesukaran berikut:

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)
}
Terdapat konflik antara

http.FileServerhttp.HandleFunc.

Sebagai contoh, apabila saya menulis: http.ListenAndServe(":80", nil) 时,所有路由 (http.HandleFunc) kedua-duanya akan berfungsi, tetapi jika saya cuba melakukan perkara berikut:

http.ListenAndServe(":80", http.FileServer(http.Dir("")))

Tiada laluan yang sah (kecuali http.HandleFunc("/")). Mengapa?

Bagaimana untuk mengatasi halaman ralat 404? Saya harap Go mempunyai kaedah seperti http.HandleError yang menerima antara muka http.ResponseWriter dan http.Request tetapi saya tidak menemuinya sesuatu yang serupa. http.HandleError 这样的方法,它接受 http.ResponseWriterhttp.Request 的接口,但我找不到类似的东西。

解决方法

检查 http.ListenAndServePenyelesaian

Semak dokumentasi http.ListenAndServe:<code>handler 为 nil,则将使用默认处理程序 http.HandleFunc Jika

: DefaultServeMux 注册了两条路由;调用 http.ListenAndServe(":80", nil) 使用默认处理程序(您添加了路由),因此 /test 可以工作(更多信息如下!)。但是,当您运行 http.ListenAndServe(":80", fs) 时,您将传入一个特定的处理程序 (fs Jadi dalam kod anda, anda gunakan

) jadi semua permintaan akan dihantar kepada pengendali ini (ia akan cuba menyampaikan fail dari sistem fail tempatan). http.ListenAndServe(":80", nil)

Mulai saat ini, saya akan menganggap bahawa

sedang digunakan (sejak menambah pengendali dan kemudian tidak menggunakannya tidak benar-benar masuk akal). ServeMuxdisebutkan di atas

jadi mari kita semak dokumen:/test/ 长,因此优先)。这意味着对 /test 的请求将触发 fmt.Fprint(w, "测试页") ,其他所有内容将调用加载 index.html 的处理程序。需要注意的是,您尚未添加引用 fs ).

    Semoga ini menjelaskan perkara yang sedang berlaku; berikut adalah beberapa soalan yang sepatutnya membantu dari segi mencapai keputusan yang anda inginkan:
  • Gunakan http.FileServer untuk mengendalikan 404 halaman tersuai
  • Gunakan Penghala Golang Mux dan http.FileServer untuk mencapai fail root yang diharapkan dan 404 tersuai
  • Tersuai 404 menggunakan Gorilla Mux dan std http.FileServer
  • Golang. Apa yang perlu digunakan? http.ServeFile(..) atau http.FileServer(..)?
  • Bagaimana cara membuat ubah hala golang ke penghalaan bahagian hadapan?
🎜 🎜

Atas ialah kandungan terperinci Bagaimana untuk menulis semula 40​​4 dalam Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam