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
> 

Reply via email to