Я создаю небольшой сайт на Go и у меня возникают проблемы с пользовательской страницей 404.Вот мой текущий код маршрутизатора:
r := mux.NewRouter()
// Page routing
r.HandleFunc("/", homeHandler).Methods("GET")
r.HandleFunc("/example1", exampleOneHandler).Methods("GET")
r.HandleFunc("/example2", exampleTwoHandler).Methods("GET", "POST")
// Other paths for static assets omitted
// Psuedo-root directory for icon files, etc.
r.PathPrefix("/").Handler(http.FileServer(http.Dir("public")))
// 404 Page
r.NotFoundHandler = http.HandlerFunc(notFoundHandler)
log.Fatal(http.ListenAndServe(":1234", r))
Итак, без определения PathPrefix в строке 11, notFoundHandler запускается, как и ожидалось, и возвращает пользовательский HTML 404.
Однако теперь я добавилэто определение пути для соответствия стандартам корневого каталога, таким как favicon.ico, robots.txt, значки приложений и т. д., и это работает как задумано.Однако в качестве побочного эффекта все, что не соответствует / example1 или / example2, скажем, / example3, будет искать файл с именем «example3» в каталоге psuedo-root через http.FileServer.После того, как он не находит его, FileServer пишет напрямую в http.ResponseWriter с «404 not found», полностью обойдя NotFoundHandler мультиплексора.
Единственное возможное решение, которое я вижу, - это добавление явного маршрута для каждого файла,но это кажется довольно жестоким решением.Есть ли более изящный способ решения этой проблемы, который мне не хватает?