登录
首页 >  Golang >  Go问答

使用 Golang Mux Router 和 http.FileServer 预期的根文件和自定义 404

来源:stackoverflow

时间:2024-04-19 14:54:35 328浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《使用 Golang Mux Router 和 http.FileServer 预期的根文件和自定义 404》,聊聊,我们一起来看看吧!

问题内容

我正在用 go 构建一个小型网站,但遇到了自定义 404 页面的问题。这是我当前的路由器代码:

r := mux.NewRouter()

// Page routing
r.HandleFunc("/", homeHandler).Methods("GET")
r.HandleFunc("/example1", exampleOneHandler).Methods("GET")
r.HandleFunc("/example2", exampleTwoHandler).Methods("GET", "POST")

// Other paths for static assets omitted

// Psuedo-root directory for icon files, etc.
r.PathPrefix("/").Handler(http.FileServer(http.Dir("public")))

// 404 Page
r.NotFoundHandler = http.HandlerFunc(notFoundHandler)

log.Fatal(http.ListenAndServe(":1234", r))

因此,如果第 11 行没有 pathprefix 定义,notfoundhandler 将按预期命中并返回自定义 404 html。

但是,现在我添加了该路径定义来满足根目录标准,例如 favicon.ico、robots.txt、应用程序图标等,并且可以按预期工作。然而,作为副作用,任何与 /example1 或 /example2 不匹配的内容(比如 /example3)都会通过 http.fileserver 在 psuedo-root 目录中查找名为“example3”的文件。找不到之后,fileserver 直接向 http.responsewriter 写入“404 not found”,完全绕过 mux 的 notfoundhandler。

我能看到的唯一可行的解​​决方案是为每个文件添加显式路由,但这似乎是一个相当残酷的解决方案。有没有更优雅的方法来解决我所缺少的这个问题?


解决方案


对于没有注册处理程序的路径,将激活 notFoundHandler。由于您注册了一个处理程序(文件服务器)到路径 "/",它将始终匹配所有请求,因此不会再调用未找到的处理程序。

要避免这种情况,最简单的方法是手动注册必须位于根目录的所有文件(这些文件并不多,或者至少不应该)。如果您有一堆其他非标准静态文件,请将它们发布到 /static/ 等路径下,因此 /example3 等未注册的路径将触发未找到处理程序。

另一个解决方案可能是将文件服务器保留在路径 "/" 处,但将其包装起来,如果它返回 404 状态代码,请调用您自己的 notFoundHandler 来提供自定义错误页面。与我之前的建议相比,这更复杂,所以我仍然会选择那个。

到这里,我们也就讲完了《使用 Golang Mux Router 和 http.FileServer 预期的根文件和自定义 404》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>