我有以下代碼,一切工作正常。自定義404與大猩猩Mux和標準http.FileServer
var view404 = template.Must(template.ParseFiles("views/404.html"))
func NotFound(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(404)
err := view404.Execute(w, nil)
check(err)
}
func main() {
router := mux.NewRouter()
router.StrictSlash(true)
router.NotFoundHandler = http.HandlerFunc(NotFound)
router.Handle("/", IndexHandler).Methods("GET")
router.PathPrefix("/public/").Handler(http.StripPrefix("/public/", http.FileServer(http.Dir("public"))))
http.Handle("/", router)
http.ListenAndServe(":8000", nil)
}
對像/cannot/find
這樣的路線的請求顯示我的自定義404模板。我的/public/
目錄中的所有靜態文件也可以正常使用。
我有一個問題處理不存在的靜態文件,並顯示我的自定義NotFound
他們的處理程序。到/public/cannot/find
請求調用標準http.NotFoundHandler與
404頁的答覆沒有找到
我怎麼能有正常的路由和靜態文件相同的自定義NotFoundHandler?
更新
我最終通過纏繞http.ServeFile
爲@Dewy布羅託建議實施我自己FileHandler
。
type FileHandler struct {
Path string
}
func (f FileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
prefix := "public"
http.ServeFile(w, r, path.Join(prefix, f.Path))
}
// ...
router.Handle("/css/styles.css", FileHandler{"/css/styles.css"}).Methods("GET")
現在我的NotFound
處理程序捕獲所有丟失的路由,甚至丟失文件。
Eek。現在你需要一個處理器來處理你想要的每個文件。圖片,JavaScript等......我更喜歡他的鉤子解決方案,但即便如此,這是一個簡單的目標很多代碼。 – 2015-11-18 16:37:08