Как обслуживать файл, если URL не соответствует ни одному шаблону в Go?
Я создаю одностраничное приложение, используя Angular 2 и Go, а в Angular я использую маршрутизацию. Если я открою сайт, скажем, http://example.com/
Иди обслужи меня мой index.html
файл, который хорош, потому что я написал это:
mux.Handle("/", http.FileServer(http.Dir(mysiteRoot)))
Теперь у меня есть маршрут в Angular, скажем, /posts
и если это маршрут по умолчанию (то есть, когда useAsDefault
является true
) или если я просто вручную перейти к http://example.com/posts
Я получу ошибку 404 от Go, что означает, что для этого пути не указан обработчик.
Я не думаю, что создание обработчика в Go для каждого отдельного Angular-маршрута - хорошая идея, потому что может быть много маршрутов. Итак, мой вопрос, как я могу служить index.html
в Go, если URL-адрес запроса не совпадает ни с одним другим шаблоном, установленным в моем ServeMux
?
2 ответа
Ну, это было довольно легко на самом деле. net/http
Документация говорит это:
Обратите внимание, что поскольку шаблон, заканчивающийся косой чертой, называет корневое поддерево, шаблон "/" соответствует всем путям, которые не соответствуют другим зарегистрированным шаблонам, а не только URL-адресу с путем == "/".
Поэтому мне нужно было что-то сделать с моим "/"
обработчик. http.FileServer
ищет файлы в каталоге, указанном в строке шаблона, поэтому я просто заменил его следующим:
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, mysiteRoot + "index.html")
})
И это работает просто отлично.
Я думаю, что вам нужно будет изменить настройки поставщика URL в вашем приложении angular2, чтобы использовать HashLocationStrategy. Используя это, ваши маршруты будут иметь вид
#/ сообщений
и не будет запускать какой-либо маршрут в вашем приложении golang.