Skip to main content
Version: 2.10.x(Latest)

We can customize the handling of status codes specified by WebServer, for example, for common errors like 404/403/500, we can display custom error messages, page content, or redirect to a specific page.

The related methods are as follows:

func (s *Server) BindStatusHandler(status int, handler HandlerFunc)
func (s *Server) BindStatusHandlerByMap(handlerMap map[int]HandlerFunc)

func (d *Domain) BindStatusHandler(status int, handler HandlerFunc)
func (d *Domain) BindStatusHandlerByMap(handlerMap map[int]HandlerFunc)

As we can see, we can use BindStatusHandler or BindStatusHandlerByMap to implement custom callback handling for specified status codes, and this feature also supports binding to specific domain names. Let's look at a few simple examples.

Basic Usage​

package main

import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
s := g.Server()
s.BindHandler("/", func(r *ghttp.Request){
r.Response.Writeln("halo world!")
})
s.BindStatusHandler(404, func(r *ghttp.Request){
r.Response.Writeln("This is customized 404 page")
})
s.SetPort(8199)
s.Run()
}

After execution, when we visit an unbound route page, such as http://127.0.0.1:8199/test, we can see the page shows our expected return result: This is customized 404 page.

Moreover, the common way of handling web page request error status codes is to guide users to a specific error page. Therefore, in the status code callback handling function, we can use the r.RedirectTo method to perform page redirection, as shown in the following example:

package main

import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
s := g.Server()
s.BindHandler("/status/:status", func(r *ghttp.Request) {
r.Response.Write("woops, status ", r.Get("status"), " found")
})
s.BindStatusHandler(404, func(r *ghttp.Request){
r.Response.RedirectTo("/status/404")
})
s.SetPort(8199)
s.Run()
}

After execution, when we manually access a non-existent page through the browser, such as http://127.0.0.1:8199/test, we can see the page is redirected to http://127.0.0.1:8199/status/404, and the page returns the content: woops, status 404 found

Batch Settings​

package main

import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
s := g.Server()
s.BindStatusHandlerByMap(map[int]ghttp.HandlerFunc {
403 : func(r *ghttp.Request){r.Response.Writeln("403")},
404 : func(r *ghttp.Request){r.Response.Writeln("404")},
500 : func(r *ghttp.Request){r.Response.Writeln("500")},
})
s.SetPort(8199)
s.Run()
}

As we can see, we can use the BindStatusHandlerByMap method for batch settings of custom status codes. After the example program is executed, when the service API returns status codes 403/404/500, the API will return the corresponding status code number.

Precautions​

If content output is involved in custom status code handling methods, it's often necessary to use r.Response.ClearBuffer() to clear the original buffered output content.