Я использую Google App Engine для обслуживания своего (полу)статического веб-сайта, созданного с помощью Hugo. У меня есть общедоступный каталог, в котором хранятся и обслуживаются все файлы HTML. У меня также есть несколько серверных скриптов, например, для обработки контактной формы. Файл app.yaml
выглядит так.
// app.yaml
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
secure: always
А упрощенный файл main.go
выглядит так
// main.go
package main
import (
"net/http"
"encoding/json"
"appengine"
"appengine/urlfetch"
)
func init() {
fileHandler := http.FileServer(http.Dir("public"))
http.Handle("/", fileHandler)
http.HandleFunc("/contactus/", HandleContactus)
}
Это отлично работает и обслуживает файлы html. Тем не менее, я ищу решение для случаев, когда страницы не найдены, а ответ, например, 404 Not Found
(или любая другая ошибка сервера).
Моя мысль состояла в том, чтобы создать собственный обработчик, который можно было бы передать в http.Handle("/", myCustomHandler)
и который обрабатывал бы ответ сервера и перенаправлял бы на пользовательский 404.html
или тому подобное, если это необходимо. Я новичок в Go и не могу понять, как это должно быть реализовано. Я также смотрел на Gorilla Mux, но предпочел бы (если возможно) не использовать внешние библиотеки, чтобы упростить его.
Основываясь на этом сообщении, я попытался следующее
package main
import (
"net/http"
"encoding/json"
"appengine"
"appengine/urlfetch"
)
func StaticSiteHandler(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
h.ServeHTTP(w, r)
})
}
func init() {
fileHandler := http.FileServer(http.Dir("public"))
http.Handle("/", StaticSiteHandler(fileHandler))
http.HandleFunc("/contactus/", HandleContactus)
}
Это решение работает в том смысле, что оно также обслуживает мои HTML-страницы, однако я до сих пор не могу понять, как обрабатывать коды ответа сервера.
Любая помощь будет высоко оценен. Спасибо!