ホームページ バックエンド開発 Golang 404 エラー応答をカスタマイズし、Go 静的ファイル サーバーの特定のページにユーザーをリダイレクトするにはどうすればよいですか?

404 エラー応答をカスタマイズし、Go 静的ファイル サーバーの特定のページにユーザーをリダイレクトするにはどうすればよいですか?

Oct 29, 2024 am 03:41 AM

How can I customize 404 error responses and redirect users to a specific page in a Go static file server?

Go 静的ファイル サーバーでの 404 エラーの処理

Go サーバーを使用して静的ファイルを提供する場合、通常、見つからないファイル リクエストにより 404 Not エラーが発生しますエラーが見つかりました。この動作をカスタマイズし、ユーザーを特定のページ (index.html など) にリダイレクトするには、カスタム ハンドラーを実装できます。

カスタム ハンドラーの作成

デフォルトの FileServer Go 標準ライブラリが提供するハンドラーはエラーのカスタマイズをサポートしていません。カスタム ハンドラーを実装するには、それをラップし、応答ステータス コードを監視します。 404 エラーが検出された場合は、応答をリダイレクトに置き換えます。

ステータス コードを検査する応答ライターのサンプルを次に示します。

<code class="go">type NotFoundRedirectRespWr struct {
    http.ResponseWriter // Embedded http.ResponseWriter
    status              int
}

func (w *NotFoundRedirectRespWr) WriteHeader(status int) {
    w.status = status
    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 about successful writing
}</code>
ログイン後にコピー

ファイル サーバー ハンドラーのラップ

ラップされたハンドラー関数は、元のハンドラーを呼び出してステータス コードを確認します。 404 の場合は、index.html にリダイレクトされます。

<code class="go">func wrapHandler(h http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        nfrw := &amp;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>
ログイン後にコピー

カスタム ハンドラーの使用

main 関数で、ラップされたハンドラーをルート URL に登録します:

<code class="go">func main() {
    fs := wrapHandler(http.FileServer(http.Dir(".")))
    http.HandleFunc("/", fs)
    panic(http.ListenAndServe(":8080", nil))
}</code>
ログイン後にコピー

ログ出力

存在しないファイルにアクセスしようとすると、次のログが生成されます:

2017/11/14 14:10:21 Redirecting /a.txt3 to /index.html.
2017/11/14 14:10:21 Redirecting /favicon.ico to /index.html.
ログイン後にコピー

注: favicon.ico を含むすべての見つからないファイルは、index.html にリダイレクトされます。これが望ましくない場合は、必要に応じて例外を追加できます。

完全なコード サンプル

完全なコード サンプルについては、Go プレイグラウンドにアクセスしてください:

[https://go.dev/play/p/51SEMfTIM8s](https://go.dev/play/p/51SEMfTIM8s)

以上が404 エラー応答をカスタマイズし、Go 静的ファイル サーバーの特定のページにユーザーをリダイレクトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか?

See all articles