Go にミドルウェアがあるシナリオに直面しています。カスタムの「Server」ヘッダーを設定しようとします。ただし、アプリケーションまたは他のミドルウェアによって設定された既存の「サーバー」ヘッダーは存続するため、応答に複数の「サーバー」ヘッダーが含まれます。
HTTP セマンティクスに従って、応答ヘッダーを変更します。 ServeHTTP メソッドが戻った後は禁止されています。この制限は、リクエストの処理とレスポンスの最終処理の間に明確な境界を確立することを目的としています。
1.カスタム ResponseWriter:
ヘッダー変更操作をインターセプトするカスタム ResponseWriter ラッパーを定義します。ヘッダーを書き込む前に、ラッパーはカスタムの「Server」ヘッダーを挿入します。このアプローチでは、追加の間接層が追加されますが、ヘッダー管理をきめ細かく制御できます。
カスタム ResponseWriter の実装例を次に示します。
type serverWriter struct { w http.ResponseWriter name string wroteHeader bool } func (s serverWriter) WriteHeader(code int) { if s.wroteHeader == false { s.w.Header().Set("Server", s.name) s.wroteHeader = true } s.w.WriteHeader(code) } func (s serverWriter) Write(b []byte) (int, error) { return s.w.Write(b) } func (s serverWriter) Header() http.Header { return s.w.Header() }
ミドルウェアでは、これを使用できます。ヘッダー挿入を制御するカスタム ResponseWriter:
func Server(h http.Handler, serverName string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sw := serverWriter{ w: w, name: serverName, wroteHeader: false, } h.ServeHTTP(sw, r) }) }
2.ミドルウェア順序の逆転:
別のアプローチは、「サーバー」ヘッダー設定ミドルウェアが他のすべてのミドルウェアの後に実行されるように、ミドルウェアの順序を逆転することです。これにより、ヘッダーの変更が応答が完了する前の最後の操作になることが保証されます。
3.最内ミドルウェア:
可能であれば、「サーバー」ヘッダー設定ミドルウェアをミドルウェアの最内層として配置します。これにより、外部ミドルウェアが「Server」ヘッダーを設定した後にそれを変更する可能性が排除されます。
4.応答の変更:
最後の手段として、応答をインターセプトし、それに応じて「Server」ヘッダーを変更するカスタム http.Handler の使用を検討できます。このアプローチでは、アプリケーションの他の機能を壊さないように慎重に扱う必要があります。
以上がGo ミドルウェアで HTTP ヘッダーを効果的に制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。