您面臨的情況是Go 中有中間件嘗試設定自訂“伺服器”標頭。但是,應用程式或其他中間件設定的現有「伺服器」標頭仍然存在,導致回應中出現多個「伺服器」標頭。
根據 HTTP 語義,修改回應標頭ServeHTTP 方法返回後被禁止。此限制旨在在請求處理和回應最終確定之間建立明確的界限。
1.自訂 ResponseWriter:
定義一個自訂 ResponseWriter 包裝器,用於攔截標頭修改操作。在寫入任何標頭之前,包裝器會插入您的自訂「伺服器」標頭。這種方法增加了額外的間接層,但提供了對標頭管理的細粒度控制。
這是自訂 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.回應修改:
作為最後的手段,您可以考慮使用自訂 http.Handler 來攔截回應並相應地修改「Server」標頭。這種方法需要小心處理,以避免破壞應用程式中的其他功能。
以上是Go中介軟體如何有效控制HTTP頭?的詳細內容。更多資訊請關注PHP中文網其他相關文章!