diff --git a/internal/mode/static/nginx/config/servers.go b/internal/mode/static/nginx/config/servers.go index 0e2c58f10a..f7d76e2e80 100644 --- a/internal/mode/static/nginx/config/servers.go +++ b/internal/mode/static/nginx/config/servers.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "maps" + "slices" "strconv" "strings" gotemplate "text/template" @@ -812,7 +813,15 @@ func generateProxySetHeaders( }) } - return append(proxySetHeaders, baseHeaders...) + for _, header := range baseHeaders { + if !slices.ContainsFunc(proxySetHeaders, func(h http.Header) bool { + return header.Name == h.Name + }) { + proxySetHeaders = append(proxySetHeaders, header) + } + } + + return proxySetHeaders } func generateResponseHeaders(filters *dataplane.HTTPFilters) http.ResponseHeaders { diff --git a/internal/mode/static/nginx/config/servers_test.go b/internal/mode/static/nginx/config/servers_test.go index 29d84d0c77..56da44f1fa 100644 --- a/internal/mode/static/nginx/config/servers_test.go +++ b/internal/mode/static/nginx/config/servers_test.go @@ -3146,6 +3146,54 @@ func TestGenerateProxySetHeaders(t *testing.T) { }, httpBaseHeaders...), baseHeaders: httpBaseHeaders, }, + { + msg: "header filter overwrite base header", + filters: &dataplane.HTTPFilters{ + RequestHeaderModifiers: &dataplane.HTTPHeaderFilter{ + Set: []dataplane.HTTPHeader{ + { + Name: "X-Forwarded-Proto", + Value: "new-proto", + }, + }, + }, + }, + expectedHeaders: []http.Header{ + { + Name: "X-Forwarded-Proto", + Value: "new-proto", + }, + { + Name: "Host", + Value: "$gw_api_compliant_host", + }, + { + Name: "X-Forwarded-For", + Value: "$proxy_add_x_forwarded_for", + }, + { + Name: "X-Real-IP", + Value: "$remote_addr", + }, + { + Name: "X-Forwarded-Host", + Value: "$host", + }, + { + Name: "X-Forwarded-Port", + Value: "$server_port", + }, + { + Name: "Upgrade", + Value: "$http_upgrade", + }, + { + Name: "Connection", + Value: "$connection_upgrade", + }, + }, + baseHeaders: httpBaseHeaders, + }, { msg: "with url rewrite hostname", filters: &dataplane.HTTPFilters{