diff --git a/pkg/middlewares/customerrors/custom_errors.go b/pkg/middlewares/customerrors/custom_errors.go index d9c95ea6d..6c1a91c4b 100644 --- a/pkg/middlewares/customerrors/custom_errors.go +++ b/pkg/middlewares/customerrors/custom_errors.go @@ -122,11 +122,18 @@ func (c *customErrors) ServeHTTP(rw http.ResponseWriter, req *http.Request) { } var query string + + scheme := "http" + if req.TLS != nil { + scheme = "https" + } + orig := &url.URL{Scheme: scheme, Host: req.Host, Path: req.URL.Path, RawPath: req.URL.RawPath, RawQuery: req.URL.RawQuery, Fragment: req.URL.Fragment} + if len(c.backendQuery) > 0 { query = "/" + strings.TrimPrefix(c.backendQuery, "/") query = strings.ReplaceAll(query, "{status}", strconv.Itoa(code)) query = strings.ReplaceAll(query, "{originalStatus}", strconv.Itoa(originalCode)) - query = strings.ReplaceAll(query, "{url}", url.QueryEscape(req.URL.String())) + query = strings.ReplaceAll(query, "{url}", url.QueryEscape(orig.String())) } pageReq, err := newRequest("http://" + req.Host + query) diff --git a/pkg/middlewares/customerrors/custom_errors_test.go b/pkg/middlewares/customerrors/custom_errors_test.go index 6cf745da8..ec8eff153 100644 --- a/pkg/middlewares/customerrors/custom_errors_test.go +++ b/pkg/middlewares/customerrors/custom_errors_test.go @@ -175,6 +175,10 @@ func TestHandler(t *testing.T) { req := testhelpers.MustNewRequest(http.MethodGet, "http://localhost/test?foo=bar&baz=buz", nil) + // Client like browser and curl will issue a relative HTTP request, which not have a host and scheme in the URL. But the http.NewRequest will set them automatically. + req.URL.Host = "" + req.URL.Scheme = "" + recorder := httptest.NewRecorder() errorPageHandler.ServeHTTP(recorder, req)