Home  >  Article  >  Backend Development  >  How to rewrite 40​​4 in Golang

How to rewrite 40​​4 in Golang

WBOY
WBOYforward
2024-02-08 21:30:191164browse

如何在 Golang 中重写 40​​4

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!

Question content

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.

Solution

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

  • Use Golang Mux Router and http.FileServer to achieve expected root files and custom 404
  • Custom 404 using Gorilla Mux and std http.FileServer
  • Golang. What to use? http.ServeFile(..) or http.FileServer(..)?
  • How to make golang redirect to front-end routing?
  • The above is the detailed content of How to rewrite 40​​4 in Golang. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete