From 4b678ce9fddbbc2539a9bf74a7cdee92021c8cd8 Mon Sep 17 00:00:00 2001 From: LBF38 Date: Thu, 16 Apr 2026 10:40:10 +0200 Subject: [PATCH] Fix app-root with query params redirect --- pkg/config/dynamic/middlewares.go | 2 +- .../kubernetes/ingress-nginx/kubernetes.go | 2 +- .../ingress-nginx/kubernetes_test.go | 20 +++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/config/dynamic/middlewares.go b/pkg/config/dynamic/middlewares.go index 7a3d2b8b7b..aa39a115ab 100644 --- a/pkg/config/dynamic/middlewares.go +++ b/pkg/config/dynamic/middlewares.go @@ -715,7 +715,7 @@ type RedirectScheme struct { Permanent bool `json:"permanent,omitempty" toml:"permanent,omitempty" yaml:"permanent,omitempty" export:"true"` // ForcePermanentRedirect is an internal field (not exposed in configuration). // When set to true, this forces the use of permanent redirects 308, regardless of the request method. - // Used by the provider ingress-ngin. + // Used by the provider ingress-nginx. ForcePermanentRedirect bool `json:"-" toml:"-" yaml:"-" label:"-" file:"-" kv:"-" export:"true"` } diff --git a/pkg/provider/kubernetes/ingress-nginx/kubernetes.go b/pkg/provider/kubernetes/ingress-nginx/kubernetes.go index c78d8e7325..f533ddb187 100644 --- a/pkg/provider/kubernetes/ingress-nginx/kubernetes.go +++ b/pkg/provider/kubernetes/ingress-nginx/kubernetes.go @@ -1675,7 +1675,7 @@ func applyAppRootConfiguration(routerName string, ingressConfig IngressConfig, r appRootMiddlewareName := routerName + "-app-root" conf.HTTP.Middlewares[appRootMiddlewareName] = &dynamic.Middleware{ RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1" + *ingressConfig.AppRoot, }, } diff --git a/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go b/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go index 9006dcfb60..d515d9148a 100644 --- a/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go @@ -3859,13 +3859,13 @@ func TestLoadIngresses(t *testing.T) { Middlewares: map[string]*dynamic.Middleware{ "default-ingress-with-app-root-rule-0-path-0-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, "default-ingress-with-app-root-rule-0-path-0-tls-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, @@ -11528,25 +11528,25 @@ func TestLoadIngresses(t *testing.T) { Middlewares: map[string]*dynamic.Middleware{ "default-ingress-with-canary-middlewares-rule-0-path-0-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, "default-ingress-with-canary-middlewares-rule-0-path-0-tls-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, "default-ingress-with-canary-middlewares-rule-0-path-0-canary-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, "default-ingress-with-canary-middlewares-rule-0-path-0-canary-tls-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, @@ -11828,13 +11828,13 @@ func TestLoadIngresses(t *testing.T) { Middlewares: map[string]*dynamic.Middleware{ "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-tls-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, @@ -11850,13 +11850,13 @@ func TestLoadIngresses(t *testing.T) { }, "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-canary-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, }, "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-canary-tls-app-root": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `^(https?://[^/]+)/$`, + Regex: `^(https?://[^/]+)/(\?.*)?$`, Replacement: "$1/foo", }, },