Home > Article > Backend Development > How to rewrite 404 in Golang
In Golang, rewriting the 404 error page is a common requirement, which can help us provide more friendly and personalized error prompts. In this article, PHP editor Xigua will introduce to you how to rewrite the 404 page in Golang. We will use the Gin framework to build web applications and handle 404 errors through custom middleware. Through the guidance of this article, you will learn how to rewrite the 404 page simply and quickly to improve user experience. let's start!
I'm still learning how to use Go for web development, but when I try to create a simple website, I face the following difficulties:
package main import ( "fmt" "html/template" "net/http" ) func main() { fs := http.FileServer(http.Dir("")) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { tmpl, _ := template.ParseFiles("index.html") tmpl.Execute(w, nil) }) /** * This route will return a 404 error */ http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Test page") }) /** * If I replace fs to nil, /test route will be work, but non-existent routes * will be return index.html template (home router) instead 404 error. Why? */ http.ListenAndServe(":80", fs) }There is a conflict between
http.FileServer
and http.HandleFunc
.
For example, when I write: http.ListenAndServe(":80", nil)
, all routes (http.HandleFunc
) will work, but if I try to execute The following operations:
http.ListenAndServe(":80", http.FileServer(http.Dir("")))
No route is valid (except http.HandleFunc("/"))
. Why?
How to override 404 error page? I wish Go had a method like http.HandleError
which accepts interfaces http.ResponseWriter
and http.Request
but I can't find anything similar thing.
Check the documentation for http.ListenAndServe
:
If handler
is nil, the default handler http.HandleFunc
will be used:
So, in your code, you registered two routes using DefaultServeMux
; calling http.ListenAndServe(":80", nil)
uses the default handler (that you Routes added) so /test
works (more info below!). However, when you run http.ListenAndServe(":80", fs)
you are passing in a specific handler (fs
) so all requests will be sent to This handler (which will try to serve the file from the local file system).
From this point on, I'm going to assume that http.ListenAndServe(":80", nil)
is being used (since adding handlers and then not using them doesn't really make sense).
mentioned aboveServeMux
So let’s check the documentation:
So the Mux receives the request and figures out which handler should be called to handle the request (note that only one handler will be called). Matching is based on the length of the pattern (so in your example /test
is longer than /
and therefore takes precedence). This means that a request to /test
will trigger fmt.Fprint(w, "test page")
and everything else will call loading index.html
handler. Note that you have not added a handler that references fs
, so the handler is not used (and the code will not compile - Use http.FileServer to handle custom 404 pages
The above is the detailed content of How to rewrite 404 in Golang. For more information, please follow other related articles on the PHP Chinese website!