Sau đây là phương pháp tôi chọn. Nó dựa trên đoạn mã mà tôi không thể xác nhận vì tôi đã mất dấu trang của trình duyệt.
Mẫu mã: (Tôi đặt nó trong gói chính của tôi)
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);
}
}
hãy tùy chỉnh func fire404
để đầu ra phiên bản riêng của bạn thông điệp cho lỗi 404.
Nếu bạn tình cờ được sử dụng Gorilla Mux, bạn có thể muốn thay thế các chức năng chính với bên dưới:
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));
}
Xin vui lòng sửa mã nếu nó là sai, vì tôi chỉ là một newbie to Go. Cảm ơn.
+1 Cảm ơn vì phím tắt gorilla/mux. Có thể đã đá chính mình với điều đó. – eduncan911
Vâng, nó luôn luôn tốt đẹp khi một câu hỏi dự đoán một câu hỏi tiếp theo! –