假设我们有:
http.HandleFunc("/smth", smthPage) http.HandleFunc("/", homePage)
当用户尝试错误的 URL 时,他们会看到一个简单的“404 页面未找到”。如何为该案例返回自定义页面?
关于大猩猩/多路复用器的更新
对于那些使用纯 net/http 包的人来说,接受的答案是可以的。
如果你使用 gorilla/mux 你应该使用这样的东西:
func main() { r := mux.NewRouter() r.NotFoundHandler = http.HandlerFunc(notFound) }
并func notFound(w http.ResponseWriter, r *http.Request)根据需要实施。
func notFound(w http.ResponseWriter, r *http.Request)
我通常这样做:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", homeHandler) http.HandleFunc("/smth/", smthHandler) http.ListenAndServe(":12345", nil) } func homeHandler(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { errorHandler(w, r, http.StatusNotFound) return } fmt.Fprint(w, "welcome home") } func smthHandler(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/smth/" { errorHandler(w, r, http.StatusNotFound) return } fmt.Fprint(w, "welcome smth") } func errorHandler(w http.ResponseWriter, r *http.Request, status int) { w.WriteHeader(status) if status == http.StatusNotFound { fmt.Fprint(w, "custom 404") } }
在这里,我已将代码简化为仅显示自定义 404,但实际上我在此设置中做了更多工作:我使用 处理所有 HTTP 错误errorHandler,在其中记录有用信息并向自己发送电子邮件。
errorHandler