在這種情況下,您有一個Go 中間件Server,您想用它來覆蓋任何現有的Server 標頭自訂值。但是,如果請求鏈下游的任何處理程序呼叫 w.Header().Add("Server", "foo"),則會導致回應中出現多個 Server 標頭。
預期的行為是讓 Server中間件僅在寫入所有其他標頭後才附加其標頭值。但是,ServeHTTP 的語意規定必須在呼叫完成之前寫入標頭。
一種解決方法是建立一個自訂 ResponseWriter 來攔截所有標頭寫入並插入伺服器就在所有標頭被刷新之前。以下是範例:
type serverWriter struct { w http.ResponseWriter name string wroteHeader bool } func (s serverWriter) WriteHeader(code int) { if !s.wroteHeader { 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:
// Server attaches a Server header to the response. 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) }) }
此解決方案可確保在適當的時間添加Server 標頭,無論何時何地在請求鏈中添加標頭。
更多見解,您可以參考https://kev.inburke.com/kevin/how-to-write-go-middleware/。
以上是Go中間件如何控制HTTP頭來防止伺服器頭重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!