Я использую Google App Engine для обслуживания моего (полу) статического веб-сайта, созданного с помощью Hugo. У меня есть каталог «общедоступный», где хранятся все файлы HTML и их нужно обслуживать. У меня также есть некоторые серверные скрипты для обработки контактной формы, например. Файл app.yaml
выглядит так.Как обращаться с ошибкой 404 на GAE с использованием http.FileServer в Golang
// 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, но предпочел бы (если возможно) не использовать внешние библиотеки, чтобы это было просто.
на основе this post, я попытался следующие
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-страницы, однако я до сих пор не могу понять, как обрабатывать коды ответов сервера ,
Любая помощь будет высоко оценена. Спасибо!
Для будущих читателей, если вам нужно, чтобы поймать ошибки на полпути в рендеринге шаблона, или вы хотите, чтобы изменить подпись обработчика (возвращает ошибку из обработчика, к примеру), я бы полностью рекомендуйте этот подход, чтобы обернуть автоответчик, чтобы добавить к нему пользовательскую логику. – ernestoalejo
Спасибо, Томас Бройер, это решение работает хорошо. Я внедрил notFoundHandler, который просто служит для моего статического файла 404.html. – pascal