ホームページ >バックエンド開発 >Golang >シングルページアプリケーションの Go 静的ファイルサーバーでファイルが見つからない例外を処理する方法?

シングルページアプリケーションの Go 静的ファイルサーバーでファイルが見つからない例外を処理する方法?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 02:32:02866ブラウズ

How to Handle File Not Found Exceptions in a Go Static File Server for Single-Page Applications?

Go 静的ファイル サーバーでのファイルが見つからない例外の処理

Go アプリケーションでは、単一ページの Web アプリケーションを利用し、静的ファイル サーバーを使用してそのアセットを提供します。ファイルサーバー。サーバーは、ルート ディレクトリ内の既存のアセットを提供するためには適切に機能しますが、要求されたファイルが存在しない場合は 404 Not Found エラーをスローします。

目的は、サーバーの動作を変更して、任意のファイルに対して Index.html を提供することです。認識されない URL。シングルページ アプリケーションが提供される HTML と JavaScript に基づいてレンダリングを処理するため、これは非常に重要です。

ファイルが見つからない処理のカスタマイズ

http.FileServer() によって提供されるデフォルトのハンドラーにはカスタマイズ オプションがありません。 404 not found 応答の処理も含まれます。この制限に対処するために、ハンドラーをラップし、ラッパー内にロジックを実装します。

カスタム HTTP レスポンス ライターの作成

オリジナルをラップするカスタム http.ResponseWriter を作成します。レスポンスライター。このカスタム レスポンス ライターは次の処理を行います。

  1. レスポンス ステータスを検査し、特に 404 ステータス コードを探します。
  2. 404 ステータス コードが検出された場合は、クライアントにレスポンスを送信する代わりに、 、302 Found リダイレクト応答を /index.html に送信します。

以下はそのようなカスタム応答ライターの例です:

<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() によって返されるハンドラーをラップします。ラッパー ハンドラーは次の処理を行います。

  1. デフォルト ハンドラーを呼び出します。
  2. デフォルト ハンドラーがカスタム レスポンス ライターで 404 ステータス コードを設定すると、このラッパーはレスポンスをインターセプトします。
  3. 404 応答を送信する代わりに、リクエストを 302 Found ステータスで /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) // 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。