1. ホーム
  2. go

[解決済み] 標準の http パッケージでカスタム 404 エラーページを表示する

2023-08-08 10:53:03

質問

あると仮定して

http.HandleFunc("/smth", smthPage)
http.HandleFunc("/", homePage)

ユーザーが間違ったURLを試したとき、プレーンな "404 page not found" が表示されます。この場合、どのようにカスタムページを返せばよいのでしょうか?

gorilla/muxに関するアップデート

純粋なnet/httpパッケージを使用している場合は、受理された回答でOKです。

gorilla/muxを使用している場合は、このようなものを使用する必要があります。

func main() {
    r := mux.NewRouter()
    r.NotFoundHandler = http.HandlerFunc(notFound)
}

そして、実装は func notFound(w http.ResponseWriter, r *http.Request) を好きなように実装してください。

どのように解決するのですか?

いつもはこうしています。

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", homeHandler)
    http.HandleFunc("/smth/", smthHandler)
    http.ListenAndServe(":12345", nil)
}

func homeHandler(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        errorHandler(w, r, http.StatusNotFound)
        return
    }
    fmt.Fprint(w, "welcome home")
}

func smthHandler(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/smth/" {
        errorHandler(w, r, http.StatusNotFound)
        return
    }
    fmt.Fprint(w, "welcome smth")
}

func errorHandler(w http.ResponseWriter, r *http.Request, status int) {
    w.WriteHeader(status)
    if status == http.StatusNotFound {
        fmt.Fprint(w, "custom 404")
    }
}

ここでは、カスタム404だけを表示するようにコードを簡略化していますが、実際にはこのセットアップでもっと多くのことを行っています。すべての HTTP エラーを errorHandler ですべての HTTP エラーを処理し、その中で有用な情報を記録し、自分自身にメールを送信しています。