自定义 Go 静态文件服务器中的未找到文件处理
当使用 http.FileServer() 在 Go 中提供静态文件时,通常会出现未找到的文件返回 404 状态码。要自定义此行为并提供特定页面,我们需要包装 http.FileServer() 处理程序。
创建自定义 HTTP 处理程序包装器
我们创建一个自定义 http.ResponseWriter 包装器 (NotFoundRedirectRespWr) 来拦截文件服务器处理程序返回的状态代码。当状态为 404 时,我们阻止发送响应并将请求重定向到指定页面(在本例中为 /index.html)。
<code class="go">type NotFoundRedirectRespWr struct { http.ResponseWriter // We embed http.ResponseWriter status int } func (w *NotFoundRedirectRespWr) WriteHeader(status int) { w.status = status // Store the status for our own use if status != http.StatusNotFound { w.ResponseWriter.WriteHeader(status) } } func (w *NotFoundRedirectRespWr) Write(p []byte) (int, error) { if w.status != http.StatusNotFound { return w.ResponseWriter.Write(p) } return len(p), nil // Lie that we successfully written it }</code>
包装文件服务器处理程序
接下来,我们使用自定义的 wrapHandler 函数包装 http.FileServer() 处理程序。此函数将我们的自定义响应编写器添加到处理程序链中。如果响应状态为 404,我们重定向到 /index.html。
<code class="go">func wrapHandler(h http.Handler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { nfrw := &NotFoundRedirectRespWr{ResponseWriter: w} h.ServeHTTP(nfrw, r) if nfrw.status == 404 { log.Printf("Redirecting %s to index.html.", r.RequestURI) http.Redirect(w, r, "/index.html", http.StatusFound) } } }</code>
用法
要使用我们的自定义处理程序,我们替换原来的 http.FileServer () 处理程序与我们的主函数中的包装处理程序:
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }</code>
现在,任何未找到的文件都将触发我们的自定义处理程序并重定向到 /index.html。这为单页 Web 应用程序提供了更加用户友好的体验。
以上是如何定制Go静态文件服务器的404错误处理?的详细内容。更多信息请关注PHP中文网其他相关文章!