diff options
Diffstat (limited to 'internal/serving')
-rw-r--r-- | internal/serving/disk/helpers.go | 10 | ||||
-rw-r--r-- | internal/serving/disk/reader.go | 7 |
2 files changed, 15 insertions, 2 deletions
diff --git a/internal/serving/disk/helpers.go b/internal/serving/disk/helpers.go index 96360d49..c919f188 100644 --- a/internal/serving/disk/helpers.go +++ b/internal/serving/disk/helpers.go @@ -5,6 +5,7 @@ import ( "io" "mime" "net/http" + "net/url" "path/filepath" "strconv" "strings" @@ -36,6 +37,15 @@ func endsWithoutHTMLExtension(path string) bool { return !strings.HasSuffix(path, ".html") } +func cloneURL(originalURL *url.URL) *url.URL { + newURL := new(url.URL) + + // Copy relevant fields + *newURL = *originalURL + + return newURL +} + // Detect file's content-type either by extension or mime-sniffing. // Implementation is adapted from Golang's `http.serveContent()` // See https://github.com/golang/go/blob/902fc114272978a40d2e65c2510a18e870077559/src/net/http/fs.go#L194 diff --git a/internal/serving/disk/reader.go b/internal/serving/disk/reader.go index a483a8fe..a7d1bb29 100644 --- a/internal/serving/disk/reader.go +++ b/internal/serving/disk/reader.go @@ -49,7 +49,10 @@ func (reader *Reader) tryRedirects(h serving.Handler) bool { r := redirects.ParseRedirects(ctx, root) - rewrittenURL, status, err := r.Rewrite(h.Request.URL) + requestURL := cloneURL(h.Request.URL) + // Taking value from h.Request.Host as h.Request.URL.Host is not populated + requestURL.Host = h.Request.Host + rewrittenURL, status, err := r.Rewrite(requestURL) if err != nil { if !errors.Is(err, redirects.ErrNoRedirect) { // We assume that rewrite failure is not fatal @@ -65,7 +68,7 @@ func (reader *Reader) tryRedirects(h serving.Handler) bool { return reader.tryFile(h) } - http.Redirect(h.Writer, h.Request, rewrittenURL.Path, status) + http.Redirect(h.Writer, h.Request, rewrittenURL.String(), status) return true } |