显示带有标准http包的自定义404错误页面

假设我们有:


http.HandleFunc("/smth", smthPage)

http.HandleFunc("/", homePage)

尝试输入错误的URL时,用户会看到一个普通的“找不到404页”。如何为这种情况返回自定义页面?


有关大猩猩/木糖的更新


对于使用纯net / http软件包的用户,可以接受答案。


如果您使用大猩猩/多路复用器,则应使用以下内容:


func main() {

    r := mux.NewRouter()

    r.NotFoundHandler = http.HandlerFunc(notFound)

}

并func notFound(w http.ResponseWriter, r *http.Request)根据需要实施。


杨__羊羊
浏览 243回答 3
3回答

慕莱坞森

我通常这样做:package mainimport (    "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,在其中记录有用的信息并向自己发送电子邮件。

慕容森

以下是我选择的方法。它基于一个代码片段,由于我丢失了浏览器书签,因此我无法对其进行确认。示例代码:(我将其放在主程序包中)type hijack404 struct {    http.ResponseWriter    R *http.Request    Handle404 func (w http.ResponseWriter, r *http.Request) bool}func (h *hijack404) WriteHeader(code int) {    if 404 == code && h.Handle404(h.ResponseWriter, h.R) {        panic(h)    }    h.ResponseWriter.WriteHeader(code)}func Handle404(handler http.Handler, handle404 func (w http.ResponseWriter, r *http.Request) bool) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){        hijack := &hijack404{ ResponseWriter:w, R: r, Handle404: handle404 }        defer func() {            if p:=recover(); p!=nil {                if p==hijack {                    return                }                panic(p)            }        }()        handler.ServeHTTP(hijack, r)    })}func fire404(res http.ResponseWriter, req *http.Request) bool{    fmt.Fprintf(res, "File not found. Please check to see if your URL is correct.");    return true;}func main(){    handler_statics := http.StripPrefix("/static/", http.FileServer(http.Dir("/Path_To_My_Static_Files")));    var v_blessed_handler_statics http.Handler = Handle404(handler_statics, fire404);    http.Handle("/static/", v_blessed_handler_statics);    // add other handlers using http.Handle() as necessary    if err := http.ListenAndServe(":8080", nil); err != nil{        log.Fatal("ListenAndServe: ", err);    }}请自定义,func fire404以输出您自己的错误消息版本404。如果您碰巧正在使用Gorilla Mux,则不妨将主要功能替换为以下内容:func main(){    handler_statics := http.StripPrefix("/static/", http.FileServer(http.Dir("/Path_To_My_Static_Files")));    var v_blessed_handler_statics http.Handler = Handle404(handler_statics, fire404);    r := mux.NewRouter();    r.PathPrefix("/static/").Handler(v_blessed_handler_statics);    // add other handlers with r.HandleFunc() if necessary...    http.Handle("/", r);    log.Fatal(http.ListenAndServe(":8080", nil));}如果错误,请更正代码,因为我只是Go的新手。谢谢。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go