mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
parent
ee090c0940
commit
5e2a547cb5
3 changed files with 30 additions and 11 deletions
|
@ -376,17 +376,36 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, string, string, erro
|
||||||
}
|
}
|
||||||
|
|
||||||
if redirect := f.c.serverConfig.MatchRedirect(requestURI); !redirect.IsZero() {
|
if redirect := f.c.serverConfig.MatchRedirect(requestURI); !redirect.IsZero() {
|
||||||
|
doRedirect := true
|
||||||
// This matches Netlify's behaviour and is needed for SPA behaviour.
|
// This matches Netlify's behaviour and is needed for SPA behaviour.
|
||||||
// See https://docs.netlify.com/routing/redirects/rewrites-proxies/
|
// See https://docs.netlify.com/routing/redirects/rewrites-proxies/
|
||||||
if redirect.Status == 200 {
|
if !redirect.Force {
|
||||||
if r2 := f.rewriteRequest(r, strings.TrimPrefix(redirect.To, u.Path)); r2 != nil {
|
path := filepath.Clean(strings.TrimPrefix(requestURI, u.Path))
|
||||||
requestURI = redirect.To
|
fi, err := f.c.hugo().BaseFs.PublishFs.Stat(path)
|
||||||
r = r2
|
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))
|
fileserver := decorate(http.FileServer(fs))
|
||||||
mu := http.NewServeMux()
|
mu := http.NewServeMux()
|
||||||
|
|
||||||
if u.Path == "" || u.Path == "/" {
|
if u.Path == "" || u.Path == "/" {
|
||||||
mu.Handle("/", fileserver)
|
mu.Handle("/", fileserver)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -184,6 +184,7 @@ type Redirect struct {
|
||||||
From string
|
From string
|
||||||
To string
|
To string
|
||||||
Status int
|
Status int
|
||||||
|
Force bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r Redirect) IsZero() bool {
|
func (r Redirect) IsZero() bool {
|
||||||
|
|
|
@ -360,10 +360,10 @@ Note that a `status` code of 200 will trigger a [URL rewrite](https://docs.netli
|
||||||
from = "/myspa/**"
|
from = "/myspa/**"
|
||||||
to = "/myspa/"
|
to = "/myspa/"
|
||||||
status = 200
|
status = 200
|
||||||
|
force = false
|
||||||
{{< /code-toggle >}}
|
{{< /code-toggle >}}
|
||||||
|
|
||||||
|
{{< new-in "0.76.0" >}} Setting `force=true` will make a redirect even if there is existing content in the path. Note that before Hugo 0.76 `force` was the default behaviour, but this is inline with how Netlify does it.
|
||||||
|
|
||||||
|
|
||||||
## Configure Title Case
|
## Configure Title Case
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue