summaryrefslogtreecommitdiffstats
path: root/commands/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'commands/server.go')
-rw-r--r--commands/server.go36
1 files changed, 27 insertions, 9 deletions
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 {