From 5e2a547cb594b31ecb0f089b08db2e15c6dc381a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 5 Oct 2020 17:56:28 +0200 Subject: Add force flag to server redirects config Fixes #7778 --- commands/server.go | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'commands') diff --git a/commands/server.go b/commands/server.go index 602527253..7d604b97d 100644 --- a/commands/server.go +++ b/commands/server.go @@ -376,17 +376,36 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, string, string, erro } if redirect := f.c.serverConfig.MatchRedirect(requestURI); !redirect.IsZero() { + doRedirect := true // This matches Netlify's behaviour and is needed for SPA behaviour. // See https://docs.netlify.com/routing/redirects/rewrites-proxies/ - if redirect.Status == 200 { - if r2 := f.rewriteRequest(r, strings.TrimPrefix(redirect.To, u.Path)); r2 != nil { - requestURI = redirect.To - r = r2 + if !redirect.Force { + path := filepath.Clean(strings.TrimPrefix(requestURI, u.Path)) + fi, err := f.c.hugo().BaseFs.PublishFs.Stat(path) + if err == nil { + if fi.IsDir() { + // There will be overlapping directories, so we + // need to check for a file. + _, err = f.c.hugo().BaseFs.PublishFs.Stat(filepath.Join(path, "index.html")) + doRedirect = err != nil + } else { + doRedirect = false + } + + } + } + + if doRedirect { + if redirect.Status == 200 { + if r2 := f.rewriteRequest(r, strings.TrimPrefix(redirect.To, u.Path)); r2 != nil { + requestURI = redirect.To + r = r2 + } + } else { + w.Header().Set("Content-Type", "") + http.Redirect(w, r, redirect.To, redirect.Status) + return } - } else { - w.Header().Set("Content-Type", "") - http.Redirect(w, r, redirect.To, redirect.Status) - return } } @@ -416,7 +435,6 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, string, string, erro fileserver := decorate(http.FileServer(fs)) mu := http.NewServeMux() - if u.Path == "" || u.Path == "/" { mu.Handle("/", fileserver) } else { -- cgit v1.2.3