处理 Go 静态文件服务器中的 404 错误
使用 Go 服务器提供静态文件时,未找到的文件请求通常会导致 404 Not发现错误。要自定义此行为并将用户重定向到特定页面,例如index.html,可以实现自定义处理程序。
创建自定义处理程序
默认文件服务器Go标准库提供的handler不支持错误自定义。要实现自定义处理程序,请将其包装并监视响应状态代码。如果检测到 404 错误,请用重定向替换响应。
以下是检查状态代码的示例响应编写器:
<code class="go">type NotFoundRedirectRespWr struct { http.ResponseWriter // Embedded http.ResponseWriter status int } func (w *NotFoundRedirectRespWr) WriteHeader(status int) { w.status = status 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 about successful writing }</code>
包装文件服务器处理程序
包装的处理程序函数调用原始处理程序并检查状态代码。如果是 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>
使用自定义处理程序
在 main 函数中,在根 URL 注册包装的处理程序:
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }</code>
日志输出
尝试访问不存在的文件应生成以下日志:
2017/11/14 14:10:21 Redirecting /a.txt3 to /index.html. 2017/11/14 14:10:21 Redirecting /favicon.ico to /index.html.
注意: 所有未找到的文件,包括 favicon.ico,都将被重定向到 index.html。如果不需要,您可以根据需要添加例外。
完整代码示例
访问 Go Playground 以获取完整代码示例:
[https://go.dev/play/p/51SEMfTIM8s](https://go.dev/play/p/51SEMfTIM8s)
以上是如何自定义 404 错误响应并将用户重定向到 Go 静态文件服务器中的特定页面?的详细内容。更多信息请关注PHP中文网其他相关文章!