Как обслуживать файл, если 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.

Другие вопросы по тегам