FileServer メソッドを使用してローカル ディレクトリから静的ファイルを提供する場合、すべてのアセットがルート ルートが正しく提供されます。たとえば、index.html と style.css は、myserverurl/index.html と myserverurl/styles.css へのリクエストに対して問題なく提供されます。ただし、対応するファイルがないルートに対してリクエストが行われた場合は、404 エラーが返されます。
そのようなすべてのルートにindex.html を提供し、適切な画面をレンダリングするには、カスタム ハンドラーを使用できます。
ラッパー ハンドラーは、FileServer ハンドラーに渡されるラッパー http.ResponseWriter を作成します。このラッパー応答ライターはステータス コードを検査します。ステータス コードが 404 であることが判明した場合、クライアントに応答は送信されません。代わりに、/index.html へのリダイレクトが送信されます。
ラッパー http.ResponseWriter がどのように見えるかの例を次に示します。
type NotFoundRedirectRespWr struct { http.ResponseWriter // We embed http.ResponseWriter status int } func (w *NotFoundRedirectRespWr) WriteHeader(status int) { w.status = status // Store the status for our own use if status != http.StatusNotFound { w.ResponseWriter.WriteHeader(status) } } func (w *NotFoundRedirectRespWr) Write(p []byte) (int, error) { if w.status != http.StatusNotFound { return w.ResponseWriter.Write(p) } return len(p), nil // Lie that we successfully written it }
FileServer ハンドラーは、このラッパーを使用してラップされます。 :
func wrapHandler(h http.Handler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { nfrw := &NotFoundRedirectRespWr{ResponseWriter: w} h.ServeHTTP(nfrw, r) if nfrw.status == 404 { log.Printf("Redirecting %s to index.html.", r.RequestURI) http.Redirect(w, r, "/index.html", http.StatusFound) } } }
ラップされたハンドラーはリクエストを処理するために登録されます:
func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }
/a.txt3 や favicon.ico などの存在しないファイルをクエリしようとすると、次のような結果になります。 404 エラーとリクエストは /index.html.
にリダイレクトされます。以上がGo 静的ファイル サーバーで 404 エラーを Index.html にリダイレクトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。