From 07d2dcdf09fcfbd617031bd341384efb236de12c Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Fri, 29 Jan 2016 10:20:42 +0100 Subject: [PATCH] Fixed Bug #62172 FPM not working with Apache httpd 2.4 balancer/fcgi setup Only needed with Apache version < 2.4.12 (ex RHEL-7) --- sapi/fpm/fpm/fpm_main.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index f3c8ccc..d12ac01 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1108,11 +1108,14 @@ static void init_request_info(TSRMLS_D) } #define APACHE_PROXY_FCGI_PREFIX "proxy:fcgi://" - /* Fix proxy URLs in SCRIPT_FILENAME generated by Apache mod_proxy_fcgi: +#define APACHE_PROXY_BALANCER_PREFIX "proxy:balancer://" + /* Fix proxy URLs in SCRIPT_FILENAME generated by Apache mod_proxy_fcgi and mod_proxy_balancer: * proxy:fcgi://localhost:9000/some-dir/info.php/test?foo=bar + * proxy:balancer://localhost:9000/some-dir/info.php/test?foo=bar * should be changed to: * /some-dir/info.php/test * See: http://bugs.php.net/bug.php?id=54152 + * http://bugs.php.net/bug.php?id=62172 * https://issues.apache.org/bugzilla/show_bug.cgi?id=50851 */ if (env_script_filename && @@ -1136,6 +1139,27 @@ static void init_request_info(TSRMLS_D) } } + if (env_script_filename && + strncasecmp(env_script_filename, APACHE_PROXY_BALANCER_PREFIX, sizeof(APACHE_PROXY_BALANCER_PREFIX) - 1) == 0) { + /* advance to first character of hostname */ + char *p = env_script_filename + (sizeof(APACHE_PROXY_BALANCER_PREFIX) - 1); + while (*p != '\0' && *p != '/') { + p++; /* move past hostname and port */ + } + if (*p != '\0') { + /* Copy path portion in place to avoid memory leak. Note + * that this also affects what script_path_translated points + * to. */ + memmove(env_script_filename, p, strlen(p) + 1); + apache_was_here = 1; + } + /* ignore query string if sent by Apache (RewriteRule) */ + p = strchr(env_script_filename, '?'); + if (p) { + *p =0; + } + } + if (CGIG(fix_pathinfo)) { struct stat st; char *real_path = NULL;