diff --git a/internal/ingress/controller/template/template.go b/internal/ingress/controller/template/template.go index 9dfe996248..68ef01961e 100644 --- a/internal/ingress/controller/template/template.go +++ b/internal/ingress/controller/template/template.go @@ -418,39 +418,43 @@ func buildProxyPass(host string, b interface{}, loc interface{}, dynamicConfigur } if len(location.Rewrite.Target) > 0 { - abu := "" + var abu string + var xForwardedPrefix string + if location.Rewrite.AddBaseURL { // path has a slash suffix, so that it can be connected with baseuri directly - bPath := fmt.Sprintf("%s%s", path, "$baseuri") + bPath := fmt.Sprintf("%s$escaped_base_uri", path) regex := `(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)` + scheme := "$scheme" + if len(location.Rewrite.BaseURLScheme) > 0 { - abu = fmt.Sprintf(`subs_filter '%v' '$1' ro; - `, regex, location.Rewrite.BaseURLScheme, bPath) - } else { - abu = fmt.Sprintf(`subs_filter '%v' '$1' ro; - `, regex, bPath) + scheme = location.Rewrite.BaseURLScheme } + + abu = fmt.Sprintf(` +set_escape_uri $escaped_base_uri $baseuri; +subs_filter '%v' '$1' ro; +`, regex, scheme, bPath) } - xForwardedPrefix := "" if location.XForwardedPrefix { - xForwardedPrefix = fmt.Sprintf(`proxy_set_header X-Forwarded-Prefix "%s"; - `, path) + xForwardedPrefix = fmt.Sprintf("proxy_set_header X-Forwarded-Prefix \"%s\";\n", path) } + if location.Rewrite.Target == slash { // special case redirect to / // ie /something to / return fmt.Sprintf(` - rewrite %s(.*) /$1 break; - rewrite %s / break; - %v%v %s://%s; - %v`, path, location.Path, xForwardedPrefix, proxyPass, proto, upstreamName, abu) +rewrite %s(.*) /$1 break; +rewrite %s / break; +%v%v %s://%s; +%v`, path, location.Path, xForwardedPrefix, proxyPass, proto, upstreamName, abu) } return fmt.Sprintf(` - rewrite %s(.*) %s/$1 break; - %v%v %s://%s; - %v`, path, location.Rewrite.Target, xForwardedPrefix, proxyPass, proto, upstreamName, abu) +rewrite %s(.*) %s/$1 break; +%v%v %s://%s; +%v`, path, location.Rewrite.Target, xForwardedPrefix, proxyPass, proto, upstreamName, abu) } // default proxy_pass diff --git a/internal/ingress/controller/template/template_test.go b/internal/ingress/controller/template/template_test.go index 8fd606bccc..504a5b48e4 100644 --- a/internal/ingress/controller/template/template_test.go +++ b/internal/ingress/controller/template/template_test.go @@ -122,9 +122,9 @@ var ( "/jenkins", "~* /", ` - rewrite /(.*) /jenkins/$1 break; - proxy_pass http://upstream-name; - `, +rewrite /(.*) /jenkins/$1 break; +proxy_pass http://upstream-name; +`, false, "", false, @@ -136,10 +136,10 @@ var ( "/", `~* ^/something\/?(?.*)`, ` - rewrite /something/(.*) /$1 break; - rewrite /something / break; - proxy_pass http://upstream-name; - `, +rewrite /something/(.*) /$1 break; +rewrite /something / break; +proxy_pass http://upstream-name; +`, false, "", false, @@ -151,9 +151,9 @@ var ( "/not-root", "~* ^/end-with-slash/(?.*)", ` - rewrite /end-with-slash/(.*) /not-root/$1 break; - proxy_pass http://upstream-name; - `, +rewrite /end-with-slash/(.*) /not-root/$1 break; +proxy_pass http://upstream-name; +`, false, "", false, @@ -165,9 +165,9 @@ var ( "/not-root", `~* ^/something-complex\/?(?.*)`, ` - rewrite /something-complex/(.*) /not-root/$1 break; - proxy_pass http://upstream-name; - `, +rewrite /something-complex/(.*) /not-root/$1 break; +proxy_pass http://upstream-name; +`, false, "", false, @@ -179,10 +179,12 @@ var ( "/jenkins", "~* /", ` - rewrite /(.*) /jenkins/$1 break; - proxy_pass http://upstream-name; - subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, +rewrite /(.*) /jenkins/$1 break; +proxy_pass http://upstream-name; + +set_escape_uri $escaped_base_uri $baseuri; +subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; +`, true, "", false, @@ -194,11 +196,13 @@ var ( "/", `~* ^/something\/?(?.*)`, ` - rewrite /something/(.*) /$1 break; - rewrite /something / break; - proxy_pass http://upstream-name; - subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, +rewrite /something/(.*) /$1 break; +rewrite /something / break; +proxy_pass http://upstream-name; + +set_escape_uri $escaped_base_uri $baseuri; +subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; +`, true, "", false, @@ -210,10 +214,12 @@ var ( "/not-root", `~* ^/end-with-slash/(?.*)`, ` - rewrite /end-with-slash/(.*) /not-root/$1 break; - proxy_pass http://upstream-name; - subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, +rewrite /end-with-slash/(.*) /not-root/$1 break; +proxy_pass http://upstream-name; + +set_escape_uri $escaped_base_uri $baseuri; +subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; +`, true, "", false, @@ -225,10 +231,12 @@ var ( "/not-root", `~* ^/something-complex\/?(?.*)`, ` - rewrite /something-complex/(.*) /not-root/$1 break; - proxy_pass http://upstream-name; - subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, +rewrite /something-complex/(.*) /not-root/$1 break; +proxy_pass http://upstream-name; + +set_escape_uri $escaped_base_uri $baseuri; +subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; +`, true, "", false, @@ -240,11 +248,13 @@ var ( "/", `~* ^/something\/?(?.*)`, ` - rewrite /something/(.*) /$1 break; - rewrite /something / break; - proxy_pass http://upstream-name; - subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, +rewrite /something/(.*) /$1 break; +rewrite /something / break; +proxy_pass http://upstream-name; + +set_escape_uri $escaped_base_uri $baseuri; +subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; +`, true, "http", false, @@ -256,9 +266,9 @@ var ( "/something", `~* /`, ` - rewrite /(.*) /something/$1 break; - proxy_pass http://sticky-upstream-name; - `, +rewrite /(.*) /something/$1 break; +proxy_pass http://sticky-upstream-name; +`, false, "http", true, @@ -270,9 +280,9 @@ var ( "/something", `~* /`, ` - rewrite /(.*) /something/$1 break; - proxy_pass http://upstream_balancer; - `, +rewrite /(.*) /something/$1 break; +proxy_pass http://upstream_balancer; +`, false, "http", true, @@ -284,10 +294,10 @@ var ( "/something", `~* ^/there\/?(?.*)`, ` - rewrite /there/(.*) /something/$1 break; - proxy_set_header X-Forwarded-Prefix "/there/"; - proxy_pass http://sticky-upstream-name; - `, +rewrite /there/(.*) /something/$1 break; +proxy_set_header X-Forwarded-Prefix "/there/"; +proxy_pass http://sticky-upstream-name; +`, false, "http", true,