Go 静的ファイル サーバーでのファイルが見つからない処理のカスタマイズ
http.FileServer() を使用して Go で静的ファイルを提供する場合、通常、見つからないファイルは404ステータスコードを返します。この動作をカスタマイズし、代わりに特定のページを提供するには、http.FileServer() ハンドラーをラップする必要があります。
カスタム HTTP ハンドラー ラッパーの作成
カスタム http.ResponseWriter ラッパー (NotFoundRedirectRespWr) を使用して、ファイル サーバー ハンドラーから返されるステータス コードをインターセプトします。ステータスが 404 の場合、応答の送信を防止し、指定されたページ (この場合は /index.html) にリクエストをリダイレクトします。
<code class="go">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 }</code>
ファイル サーバー ハンドラーのラップ
次に、カスタムの WrapHandler 関数を使用して http.FileServer() ハンドラーをラップします。この関数は、カスタム応答ライターをハンドラー チェーンに追加します。応答ステータスが 404 の場合、/index.html にリダイレクトします。
<code class="go">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) } } }</code>
使用法
カスタム ハンドラーを使用するには、元の http.FileServer を置き換えます。 () ハンドラーとメイン関数内のラップされたハンドラー:
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) }</code>
これで、見つからないファイルがあるとカスタム ハンドラーがトリガーされ、/index.html にリダイレクトされます。これにより、単一ページの Web アプリケーションでよりユーザー フレンドリーなエクスペリエンスが提供されます。
以上がGo 静的ファイル サーバーの 404 エラー処理をカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。