我有以下代码,一切工作正常。自定义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