From ee275e34c8b303945945c650d4bc90dcc2ac0b17 Mon Sep 17 00:00:00 2001 From: David Zuelke Date: Sat, 9 Aug 2014 08:26:33 +0200 Subject: [PATCH] restore FPM compatibility with mod_fastcgi broken since #694 / 67541, fixes bug 67606 --- sapi/fpm/fpm/fpm_main.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index e879325..56a06f9 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1142,13 +1142,16 @@ static void init_request_info(TSRMLS_D) TRANSLATE_SLASHES(env_document_root); } - if (env_path_translated != NULL && env_redirect_url != NULL && + if (!apache_was_here && env_path_translated != NULL && env_redirect_url != NULL && env_path_translated != script_path_translated && strcmp(env_path_translated, script_path_translated) != 0) { /* * pretty much apache specific. If we have a redirect_url * then our script_filename and script_name point to the * php executable + * we don't want to do this for the new mod_proxy_fcgi approach, + * where redirect_url may also exist but the below will break + * with rewrites to PATH_INFO, hence the !apache_was_here check */ script_path_translated = env_path_translated; /* we correct SCRIPT_NAME now in case we don't have PATH_INFO */ @@ -1323,7 +1326,7 @@ static void init_request_info(TSRMLS_D) efree(pt); } } else { - /* make sure path_info/translated are empty */ + /* make sure original values are remembered in ORIG_ copies if we've changed them */ if (!orig_script_filename || (script_path_translated != orig_script_filename && strcmp(script_path_translated, orig_script_filename) != 0)) { @@ -1332,7 +1335,9 @@ static void init_request_info(TSRMLS_D) } script_path_translated = _sapi_cgibin_putenv("SCRIPT_FILENAME", script_path_translated TSRMLS_CC); } - if (env_redirect_url) { + if (!apache_was_here && env_redirect_url) { + /* if we used PATH_TRANSLATED to work around Apache mod_fastcgi (but not mod_proxy_fcgi, + * hence !apache_was_here) weirdness, strip info accordingly */ if (orig_path_info) { _sapi_cgibin_putenv("ORIG_PATH_INFO", orig_path_info TSRMLS_CC); _sapi_cgibin_putenv("PATH_INFO", NULL TSRMLS_CC); -- 2.1.4 From 8cac75969e5abb2b6be5bbd489d851a4f9e50979 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 15 Sep 2014 13:29:55 +0200 Subject: [PATCH] Fixed bug #65641 PHP-FPM incorrectly defines the SCRIPT_NAME variable when using Apache ProxyPass is unable to provide correct PATH_INFO as it is not aware of file path (while SetHandler is). As we can extract PATH_INFO from PATH_TRANSLATED, we also need to check if present in SCRIPT_NAME and remove it. After applying this patch. With mod_php _SERVER["REQUEST_URI"] /info.php/foo/bar?q=1 _SERVER["SCRIPT_NAME"] /info.php _SERVER["PATH_INFO"] /foor/bar _SERVER["PHP_SELF"] /info.php/foo/bar _SERVER["QUERY_STRING"] q=1 With mod_proxy_fcgi + SetHandler _SERVER["REQUEST_URI"] /info.php/foo/bar?q=1 _SERVER["SCRIPT_NAME"] /info.php _SERVER["PATH_INFO"] /foo/bar _SERVER["PHP_SELF"] /info.php/foo/bar _SERVER["QUERY_STRING"] q=1 With mod_proxy_fcgi + ProxyPass _SERVER["REQUEST_URI"] /info.php/foo/bar?q=1 _SERVER["SCRIPT_NAME"] /info.php _SERVER["PATH_INFO"] /foo/bar _SERVER["PHP_SELF"] /info.php/foo/bar _SERVER["QUERY_STRING"] q=1 --- sapi/fpm/fpm/fpm_main.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 56a06f9..331342c 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1231,6 +1231,17 @@ static void init_request_info(TSRMLS_D) SG(request_info).request_uri = orig_script_name; } path_info[0] = old; + } else if (apache_was_here && env_script_name) { + /* Using mod_proxy_fcgi and ProxyPass, apache cannot set PATH_INFO + * As we can extract PATH_INFO from PATH_TRANSLATED + * it is probably also in SCRIPT_NAME and need to be removed + */ + int snlen = strlen(env_script_name); + if (snlen>slen && !strcmp(env_script_name+snlen-slen, path_info)) { + _sapi_cgibin_putenv("ORIG_SCRIPT_NAME", orig_script_name TSRMLS_CC); + env_script_name[snlen-slen] = 0; + SG(request_info).request_uri = _sapi_cgibin_putenv("SCRIPT_NAME", env_script_name TSRMLS_CC); + } } env_path_info = _sapi_cgibin_putenv("PATH_INFO", path_info TSRMLS_CC); } -- 2.1.4