В Golang, как мне выполнить статический контент из корневого каталога, все еще имея обработчик корневого каталога для обслуживания домашней страницы.
В качестве примера используйте следующий простой веб-сервер:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", HomeHandler) // homepage
http.ListenAndServe(":8080", nil)
}
func HomeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "HomeHandler")
}
Если я делаю
http.Handle("/", http.FileServer(http.Dir("./")))
Я получаю панику, говоря, что у меня две регистрации для "/". Каждый пример Golang, который я нашел в Интернете, предлагает использовать их статический контент из разных каталогов, но это не очень помогает для таких вещей, как sitemap.xml, favicon.ico, robots.txt и другие файлы, которые являются практическими или обязанный всегда подаваться из корня.
Поведение, которое я ищу, - это поведение, которое встречается на большинстве веб-серверов, таких как Apache, Nginx или IIS, где оно сначала проходит ваши правила, и если не найдено ни одного правила, он ищет фактический файл, а если нет файла найдено 404s. Я предполагаю, что вместо написания http.HandlerFunc
мне нужно написать http.Handler
, который проверяет, ссылаюсь ли я на файл с расширением, и если это проверяет существование файла и обслуживает файл, в противном случае это 404s или обслуживает домашняя страница - запрос для "/". К сожалению, я не уверен, как начать такую задачу.
Часть меня говорит, что я значительно усложняю ситуацию, которая заставляет меня думать, что я чего-то не хватает? Любые рекомендации будут оценены.