diff --git a/pkg/middlewares/redirect/redirect_regex_test.go b/pkg/middlewares/redirect/redirect_regex_test.go index 78d4fabd0c..3c271a6032 100644 --- a/pkg/middlewares/redirect/redirect_regex_test.go +++ b/pkg/middlewares/redirect/redirect_regex_test.go @@ -138,6 +138,51 @@ func TestRedirectRegexHandler(t *testing.T) { expectedURL: "https://foo", expectedStatus: http.StatusTemporaryRedirect, }, + { + desc: "www-redirect without port", + config: dynamic.RedirectRegex{ + Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`, + Replacement: "$1://example.com$2/$3", + Permanent: true, + }, + url: "http://www.example.com/path", + expectedURL: "http://example.com/path", + expectedStatus: http.StatusMovedPermanently, + }, + { + desc: "www-redirect with port", + config: dynamic.RedirectRegex{ + Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`, + Replacement: "$1://example.com$2/$3", + Permanent: true, + }, + url: "http://www.example.com:8080/path", + expectedURL: "http://example.com:8080/path", + expectedStatus: http.StatusMovedPermanently, + }, + { + desc: "www-redirect without port, root path", + config: dynamic.RedirectRegex{ + Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`, + Replacement: "$1://example.com$2/$3", + Permanent: true, + }, + url: "http://www.example.com/", + expectedURL: "http://example.com/", + expectedStatus: http.StatusMovedPermanently, + }, + { + desc: "www-redirect HTTPS without port", + config: dynamic.RedirectRegex{ + Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`, + Replacement: "$1://example.com$2/$3", + Permanent: true, + }, + secured: true, + url: "https://www.example.com/path", + expectedURL: "https://example.com/path", + expectedStatus: http.StatusMovedPermanently, + }, { desc: "HTTP to HTTP POST permanent", config: dynamic.RedirectRegex{ diff --git a/pkg/provider/kubernetes/ingress-nginx/kubernetes.go b/pkg/provider/kubernetes/ingress-nginx/kubernetes.go index 154d467eef..7b3c5b4c71 100644 --- a/pkg/provider/kubernetes/ingress-nginx/kubernetes.go +++ b/pkg/provider/kubernetes/ingress-nginx/kubernetes.go @@ -1164,9 +1164,9 @@ func applyFromToWwwRedirect(hosts map[string]bool, ruleHost, routerName string, fromToWwwRedirectMiddlewareName := routerName + "-from-to-www-redirect" conf.HTTP.Middlewares[fromToWwwRedirectMiddlewareName] = &dynamic.Middleware{ RedirectRegex: &dynamic.RedirectRegex{ - Regex: `(https?)://[^/]+:([0-9]+)/(.*)`, - Replacement: fmt.Sprintf("$1://%s:$2/$3", ruleHost), - Permanent: true, + Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`, + Replacement: fmt.Sprintf("$1://%s$2/$3", ruleHost), + StatusCode: ptr.To(http.StatusPermanentRedirect), }, } diff --git a/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go b/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go index 36cb22a476..9cf3a2bbfa 100644 --- a/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go @@ -1238,9 +1238,9 @@ func TestLoadIngresses(t *testing.T) { Middlewares: map[string]*dynamic.Middleware{ "default-ingress-with-www-host-rule-0-path-0-from-to-www-redirect": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `(https?)://[^/]+:([0-9]+)/(.*)`, - Replacement: "$1://www.host.localhost:$2/$3", - Permanent: true, + Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`, + Replacement: "$1://www.host.localhost$2/$3", + StatusCode: ptr.To(http.StatusPermanentRedirect), }, }, "default-ingress-with-www-host-rule-0-path-0-retry": { @@ -1312,9 +1312,9 @@ func TestLoadIngresses(t *testing.T) { Middlewares: map[string]*dynamic.Middleware{ "default-ingress-with-host-rule-0-path-0-from-to-www-redirect": { RedirectRegex: &dynamic.RedirectRegex{ - Regex: `(https?)://[^/]+:([0-9]+)/(.*)`, - Replacement: "$1://host.localhost:$2/$3", - Permanent: true, + Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`, + Replacement: "$1://host.localhost$2/$3", + StatusCode: ptr.To(http.StatusPermanentRedirect), }, }, "default-ingress-with-host-rule-0-path-0-retry": {