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 := &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 サイトの他の関連記事を参照してください。