Go アプリケーションでは、単一ページの Web アプリケーションを利用し、静的ファイル サーバーを使用してそのアセットを提供します。ファイルサーバー。サーバーは、ルート ディレクトリ内の既存のアセットを提供するためには適切に機能しますが、要求されたファイルが存在しない場合は 404 Not Found エラーをスローします。
目的は、サーバーの動作を変更して、任意のファイルに対して Index.html を提供することです。認識されない URL。シングルページ アプリケーションが提供される HTML と JavaScript に基づいてレンダリングを処理するため、これは非常に重要です。
http.FileServer() によって提供されるデフォルトのハンドラーにはカスタマイズ オプションがありません。 404 not found 応答の処理も含まれます。この制限に対処するために、ハンドラーをラップし、ラッパー内にロジックを実装します。
オリジナルをラップするカスタム http.ResponseWriter を作成します。レスポンスライター。このカスタム レスポンス ライターは次の処理を行います。
以下はそのようなカスタム応答ライターの例です:
<code class="go">type NotFoundRedirectRespWr struct { http.ResponseWriter // Embed the base HTTP response writer status int } func (w *NotFoundRedirectRespWr) WriteHeader(status int) { w.status = status // Store the status code if status != http.StatusNotFound { w.ResponseWriter.WriteHeader(status) // Proceed normally for non-404 statuses } } func (w *NotFoundRedirectRespWr) Write(p []byte) (int, error) { if w.status != http.StatusNotFound { return w.ResponseWriter.Write(p) // Proceed normally for non-404 statuses } return len(p), nil // Pretend that the data was successfully written, but discard it }</code>
次に、http.FileServer() によって返されるハンドラーをラップします。ラッパー ハンドラーは次の処理を行います。
ラッパー ハンドラーの例を次に示します。
<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) // Call the default handler with our custom response writer if nfrw.status == 404 { log.Printf("Redirecting %s to index.html.", r.RequestURI) http.Redirect(w, r, "/index.html", http.StatusFound) } } }</code>
次に、main() 関数でラッパー ハンドラーを利用して、静的ファイル サーバーの動作を変更します。
<code class="go">func main() { fs := wrapHandler(http.FileServer(http.Dir("."))) // Wrap the handler http.HandleFunc("/", fs) panic(http.ListenAndServe(":8080", nil)) // Start serving files with the custom handler }</code>
このアプローチでは、すべての存在しないファイルに対応する URL へのリクエストは、index.html へのリダイレクトをトリガーします。シングルページ アプリケーションは意図したとおりに機能し、提供される HTML と JavaScript に基づいて適切なコンテンツをレンダリングします。
以上がシングルページアプリケーションの Go 静的ファイルサーバーでファイルが見つからない例外を処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。