Ожидаемые корневые файлы и пользовательские 404 с Golang Mux Router и http.FileServer - PullRequest
0 голосов
/ 20 сентября 2018

Я создаю небольшой сайт на 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 мультиплексора.

Единственное возможное решение, которое я вижу, - это добавление явного маршрута для каждого файла,но это кажется довольно жестоким решением.Есть ли более изящный способ решения этой проблемы, который мне не хватает?

1 Ответ

0 голосов
/ 20 сентября 2018

notFoundHandler активируется для путей, для которых нет зарегистрированного обработчика.А поскольку вы зарегистрировали обработчик (файловый сервер) по пути "/", он всегда будет соответствовать всем запросам, поэтому не найденный обработчик больше не будет вызываться.

Чтобы обойти это, проще всего вручную зарегистрироватьвсе файлы, которые должны быть в корне (их не так много, или, по крайней мере, не должно быть ).Если у вас есть куча других нестандартных статических файлов, опубликуйте их по пути, например /static/, поэтому незарегистрированный путь, например /example3, вызовет обработчик not-found.

Другое решение может бытьоставьте свой файловый сервер по пути "/", но оберните его, и если он вернет код состояния 404, вызовите свой собственный notFoundHandler, чтобы открыть пользовательскую страницу ошибки.Это более сложно по сравнению с моим предыдущим предложением, поэтому я все равно согласен с ним.

...