diff --git a/caddyhttp/fastcgi/fastcgi.go b/caddyhttp/fastcgi/fastcgi.go index 54eb4e36c..e5430c07c 100644 --- a/caddyhttp/fastcgi/fastcgi.go +++ b/caddyhttp/fastcgi/fastcgi.go @@ -242,9 +242,6 @@ func (h Handler) exists(path string) bool { func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]string, error) { var env map[string]string - // Get absolute path of requested resource - absPath := filepath.Join(rule.Root, fpath) - // Separate remote IP and port; more lenient than net.SplitHostPort var ip, port string if idx := strings.LastIndex(r.RemoteAddr, ":"); idx > -1 { @@ -266,11 +263,13 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string] docURI := fpath[:splitPos+len(rule.SplitPath)] pathInfo := fpath[splitPos+len(rule.SplitPath):] scriptName := fpath - scriptFilename := absPath // Strip PATH_INFO from SCRIPT_NAME scriptName = strings.TrimSuffix(scriptName, pathInfo) + // SCRIPT_FILENAME is the absolute path of SCRIPT_NAME + scriptFilename := filepath.Join(rule.Root, scriptName) + // Add vhost path prefix to scriptName. Otherwise, some PHP software will // have difficulty discovering its URL. pathPrefix, _ := r.Context().Value(caddy.CtxKey("path_prefix")).(string) diff --git a/caddyhttp/fastcgi/fastcgi_test.go b/caddyhttp/fastcgi/fastcgi_test.go index e3d3f86f3..fa45ec056 100644 --- a/caddyhttp/fastcgi/fastcgi_test.go +++ b/caddyhttp/fastcgi/fastcgi_test.go @@ -21,6 +21,7 @@ import ( "net/http/fcgi" "net/http/httptest" "net/url" + "path/filepath" "strconv" "sync" "testing" @@ -238,6 +239,15 @@ func TestBuildEnv(t *testing.T) { envExpected = newEnv() envExpected["SCRIPT_NAME"] = "/test/fgci_test.php" testBuildEnv(r, rule, fpath, envExpected) + + // 7. Test SCRIPT_NAME,SCRIPT_FILENAME do not include PATH_INFO + fpath = "/fgci_test.php/extra/paths" + r = newReq() + envExpected = newEnv() + envExpected["PATH_INFO"] = "/extra/paths" + envExpected["SCRIPT_NAME"] = "/fgci_test.php" + envExpected["SCRIPT_FILENAME"] = filepath.FromSlash("/fgci_test.php") + testBuildEnv(r, rule, fpath, envExpected) } func TestReadTimeout(t *testing.T) {