diff --git a/middleware/fastcgi/fastcgi.go b/middleware/fastcgi/fastcgi.go index 85e5b522..cdb8e91f 100644 --- a/middleware/fastcgi/fastcgi.go +++ b/middleware/fastcgi/fastcgi.go @@ -166,6 +166,17 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string] scriptFilename = absPath } + // Get the request URI. The request URI might be as it came in over the wire, + // or it might have been rewritten internally by the rewrite middleware (see issue #256). + // If it was rewritten, there will be a header indicating the original URL, + // which is needed to get the correct RequestURI value for PHP apps. + const internalRewriteFieldName = "Caddy-Rewrite-Original-URI" + reqURI := r.URL.RequestURI() + if origURI := r.Header.Get(internalRewriteFieldName); origURI != "" { + reqURI = origURI + r.Header.Del(internalRewriteFieldName) + } + // Some variables are unused but cleared explicitly to prevent // the parent environment from interfering. env = map[string]string{ @@ -192,7 +203,7 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string] "DOCUMENT_ROOT": h.AbsRoot, "DOCUMENT_URI": docURI, "HTTP_HOST": r.Host, // added here, since not always part of headers - "REQUEST_URI": r.URL.RequestURI(), + "REQUEST_URI": reqURI, "SCRIPT_FILENAME": scriptFilename, "SCRIPT_NAME": scriptName, } diff --git a/middleware/rewrite/rewrite.go b/middleware/rewrite/rewrite.go index ed2e9bd9..301e81cd 100644 --- a/middleware/rewrite/rewrite.go +++ b/middleware/rewrite/rewrite.go @@ -49,6 +49,9 @@ func NewSimpleRule(from, to string) SimpleRule { // Rewrite rewrites the internal location of the current request. func (s SimpleRule) Rewrite(r *http.Request) bool { if s.From == r.URL.Path { + // take note of this rewrite for internal use by fastcgi + // all we need is the URI, not full URL + r.Header.Set("Caddy-Rewrite-Original-URI", r.URL.RequestURI()) r.URL.Path = s.To return true } @@ -129,6 +132,10 @@ func (r *RegexpRule) Rewrite(req *http.Request) bool { return false } + // take note of this rewrite for internal use by fastcgi + // all we need is the URI, not full URL + req.Header.Set("Caddy-Rewrite-Original-URI", req.URL.RequestURI()) + // perform rewrite req.URL.Path = url.Path if url.RawQuery != "" {