为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨__羊羊 2021-05-05 16:12:29
假设我们有: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)根据需要实施。
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我通常这样做:


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,在其中记录有用的信息并向自己发送电子邮件。


查看完整回答
反对 回复 2021-05-10
?
慕容森

TA贡献1853条经验 获得超18个赞

以下是我选择的方法。它基于一个代码片段,由于我丢失了浏览器书签,因此我无法对其进行确认。


示例代码:(我将其放在主程序包中)


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的新手。谢谢。


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信