首页 > 后端开发 > Golang > 正文

如何自定义 404 错误响应并将用户重定向到 Go 静态文件服务器中的特定页面?

Mary-Kate Olsen
发布: 2024-10-29 03:41:29
原创
576 人浏览过

How can I customize 404 error responses and redirect users to a specific page in a Go static file server?

处理 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!