【发布时间】:2023-12-09 21:54:01
【问题描述】:
我有以下代码,一切正常。
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?
更新
我最终按照@Dewy Broto 的建议通过包装http.ServeFile 来实现我自己的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 处理程序会捕获所有丢失的路由甚至丢失的文件。
【问题讨论】:
-
呃。现在,您将需要一个处理程序来处理您要服务的每个文件。图片、javascript 等...我更喜欢他的钩子解决方案,但即使是这样一个简单的目标,也需要大量代码。
标签: go