diff --git a/middleware/fastcgi/fastcgi.go b/middleware/fastcgi/fastcgi.go index 9da9c02f..5dd262ff 100755 --- a/middleware/fastcgi/fastcgi.go +++ b/middleware/fastcgi/fastcgi.go @@ -167,9 +167,17 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string] } // Strip PATH_INFO from SCRIPT_NAME - indexPathInfo := strings.LastIndex(scriptName, pathInfo) - if indexPathInfo != -1 { - scriptName = scriptName[:indexPathInfo] + scriptName = strings.TrimSuffix(scriptName, pathInfo) + + // 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 @@ -198,7 +206,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/fastcgi/fcgiclient.go b/middleware/fastcgi/fcgiclient.go index b657a3b3..91f8cb87 100644 --- a/middleware/fastcgi/fcgiclient.go +++ b/middleware/fastcgi/fcgiclient.go @@ -381,9 +381,9 @@ func (c *FCGIClient) Request(p map[string]string, req io.Reader) (resp *http.Res return } if len(statusParts) > 1 { - resp.Status = statusParts[1] + resp.Status = statusParts[1] } - + } else { resp.StatusCode = http.StatusOK } 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 != "" { diff --git a/server/server.go b/server/server.go index 4f29c646..03bca607 100644 --- a/server/server.go +++ b/server/server.go @@ -14,7 +14,7 @@ import ( "os" "os/signal" - "github.com/bradfitz/http2" + "golang.org/x/net/http2" ) // Server represents an instance of a server, which serves