Try:
Proxy balancer://196f045aca6adc82a0b6eea93ed286a1/
On Jul 8, 2011, at 12:29 PM, Micha Lenk wrote:
Hi Apache developers,
I'm using Apache as a reverse proxy in a simple load balancer setup.
I use ProxyPassReverse in order to re-write the backend server name in HTTP
redirections (ie. in the Location header of the HTTP response).
My configuration for the virtual host essentially looks like this:
Proxy balancer://196f045aca6adc82a0b6eea93ed286a1
BalancerMember http://server-1.local status=-SE
BalancerMember http://server-2.local status=-SE
/Proxy
VirtualHost 10.8.16.33:80
ServerName frontend.local
Location /
ProxyPass balancer://196f045aca6adc82a0b6eea93ed286a1/
ProxyPassReverse balancer://196f045aca6adc82a0b6eea93ed286a1/
/Location
/VirtualHost
Now, I was wondering why redirects get an additional slash between the server
name and the path. Example:
1. The backend server redirects the URL http://server-1.local/foo to
the URL http://server-1.local/foo/ because this is actually a
directory (so far no issue)
2. With the configuration above the reverse proxy redirects the URL
http://frontend.local/foo to http://frontend.local//foo/
What I bother about is the additional slash before '/foo/', so I digged into
the source code and found the following lines in modules/proxy/proxy_util.c:
PROXY_DECLARE(const char *) ap_proxy_location_reverse_map(request_rec *r,
proxy_dir_conf *conf, const char *url)
{
[...]
l1 = strlen(url);
[...]
for (i = 0; i conf-raliases-nelts; i++) {
if (ap_proxy_valid_balancer_name((char *)real, 0)
(balancer = ap_proxy_get_balancer(r-pool, sconf, real))) {
int n, l3 = 0;
proxy_worker **worker = (proxy_worker **)balancer-workers-elts;
const char *urlpart = ap_strchr_c(real, '/');
if (urlpart) {
if (!urlpart[1])
urlpart = NULL;
else
l3 = strlen(urlpart);
}
for (n = 0; n balancer-workers-nelts; n++) {
l2 = strlen((*worker)-s-name);
if (urlpart) {
/* urlpart (l3) assuredly starts with its own '/' */
if ((*worker)-s-name[l2 - 1] == '/')
--l2;
if (l1 = l2 + l3
strncasecmp((*worker)-s-name, url, l2) == 0
strncmp(urlpart, url + l2, l3) == 0) {
u = apr_pstrcat(r-pool, ent[i].fake, url[l2 + l3],
NULL);
return ap_construct_url(r-pool, u, r);
}
}
else if (l1 = l2 strncasecmp((*worker)-s-name, url, l2)
== 0) {
u = apr_pstrcat(r-pool, ent[i].fake, url[l2], NULL);
return ap_construct_url(r-pool, u, r);
}
worker++;
}
[...]
Right now I don't really understand the reason for the special casing of
urlpart == / in modules/proxy/proxy_util.c, lines 1126 to 1129 (SVN rev.
1144374). If urlpart == /, then the code in lines 1151 and 1152 gets
executed, which seems to add the slash.
I tried to remove the special casing (see submitted patch), and apparently
the removal fixes the issue.
Does anybody know the reason for the special casing mentioned above?
If not I want to suggest to commit my patch.
Regards,
Micha