diff --git a/internal/proxy/reverse.go b/internal/proxy/reverse.go index f140f80..3077573 100644 --- a/internal/proxy/reverse.go +++ b/internal/proxy/reverse.go @@ -23,6 +23,8 @@ func NewReverseProxy(target *url.URL, stripPrefix, pathPrefix string, setAuth st } // Server-side requests carry RequestURI; client RoundTrip rejects it with URL.Host set. req.RequestURI = "" + req.Header.Del("Host") + req.Host = "" return } rest := strings.TrimPrefix(p, stripPrefix) @@ -33,8 +35,10 @@ func NewReverseProxy(target *url.URL, stripPrefix, pathPrefix string, setAuth st req.URL.Path = joined.Path req.URL.RawPath = joined.RawPath req.URL.Opaque = "" - // Client must send the same Host as the TLS SNI / nginx server_name. - req.Host = joined.Host + // Let net/http use req.URL.Host for the Host header and TLS SNI. + // Clear stale Host (e.g. httptest.NewRequest uses "example.com" for relative targets). + req.Host = "" + req.Header.Del("Host") if targetQuery == "" || req.URL.RawQuery == "" { req.URL.RawQuery = targetQuery + req.URL.RawQuery } else { diff --git a/internal/proxy/reverse_test.go b/internal/proxy/reverse_test.go index a27dbea..135b3f5 100644 --- a/internal/proxy/reverse_test.go +++ b/internal/proxy/reverse_test.go @@ -17,7 +17,8 @@ func TestReverseProxyPathRewrite(t *testing.T) { defer srv.Close() up, _ := url.Parse(srv.URL) rp := NewReverseProxy(up, "/api/main_srv", "/v1", "") - req := httptest.NewRequest(http.MethodGet, "/api/main_srv/health", nil) + // Absolute URL: httptest relative targets set Host to "example.com", which breaks RoundTrip to srv. + req := httptest.NewRequest(http.MethodGet, srv.URL+"/api/main_srv/health", nil) rec := httptest.NewRecorder() rp.ServeHTTP(rec, req) if rec.Code != http.StatusOK { @@ -38,7 +39,7 @@ func TestReverseProxyPathRewriteWithAPIBasePath(t *testing.T) { t.Fatal(err) } rp := NewReverseProxy(up, "/api/main_srv", "/v1", "") - req := httptest.NewRequest(http.MethodGet, "/api/main_srv/health", nil) + req := httptest.NewRequest(http.MethodGet, srv.URL+"/api/main_srv/health", nil) rec := httptest.NewRecorder() rp.ServeHTTP(rec, req) if rec.Code != http.StatusOK { @@ -59,7 +60,7 @@ func TestReverseProxyPathNestedStatsUsers(t *testing.T) { t.Fatal(err) } rp := NewReverseProxy(up, "/api/gt2", "/v1", "") - req := httptest.NewRequest(http.MethodGet, "/api/gt2/stats/users", nil) + req := httptest.NewRequest(http.MethodGet, srv.URL+"/api/gt2/stats/users", nil) rec := httptest.NewRecorder() rp.ServeHTTP(rec, req) if rec.Code != http.StatusOK {