Thanks but you ignored the config extract I mentioned. > ProxyPassReverse / https://mybackend.local
> ProxyPassReverse / https://mybackend.local:443 does this not translate to <Proxyy balancer://abcd> BalancerMember https://mybackend.local status=-SE BalancerMember https://mybackend.local:443 status=-SE </Proxy> ? I'm not even sure whether this is correct in terms of configuration - the docs speak of 'url' as argument to BalancerMember so I guess giving the port is ok. However, when accessing /path this does not do anything different then without adding the ':443' line. <https://mybackend.local:443> The original problem was that Location headers like Location: https://mybackend.local:443/path/file?query<https://myserver:443/path/file?query> are being rewritten to Location: https://myfrontend.local/:443/path/file?query which is nonsense. Based on your example I replaced the usage of the balancer argument with ProxyPass /path https://mybackend.local ProxyPassReverse /path https://mybackend.local ProxyPassReverse /path https://mybackend.local:443 and it will rewrite the above mentioned Location header to https://myfrontend.local/path:443/path/file?query which is just as wrong. Did I misunderstand you somewhere ? <https://mybackend.local:443> On Wed, Nov 27, 2013 at 11:25 AM, Plüm, Rüdiger, Vodafone Group < ruediger.pl...@vodafone.com> wrote: > ProxyPass / http://backend:8080/ > > ProxyPassReverse / http://backend:8080/ > > > > There the port matters. > > > > Fix for your issue: > > > > ProxyPassReverse / https://mybackend.local > > ProxyPassReverse / https://mybackend.local:443 > > > > Regards > > > > Rüdiger > > > > *Von:* Thomas Eckert [mailto:thomas.r.w.eck...@gmail.com] > *Gesendet:* Mittwoch, 27. November 2013 11:20 > *An:* dev@httpd.apache.org > *Betreff:* Re: ap_proxy_location_reverse_map() > > > > Given a config extract like > > > > <Proxyy balancer://abcd> > > BalancerMember https://mybackend.local status=-SE > > </Proxy> > ... > > <Location /> > > ProxyPass balancer://abcd/ > > ProxyPassReverse balancer://abcd/ > > </Location> > > what exactly is your suggestion ? Also, can you give an example for a > situation where the port matters ? > > > > On Tue, Nov 26, 2013 at 5:14 PM, Plüm, Rüdiger, Vodafone Group < > ruediger.pl...@vodafone.com> wrote: > > IMHO this should be fixed in the configuration with an additional mapping > that has the port in. In many cases the port matters. > > > > Regards > > > > Rüdiger > > > > *From:* Thomas Eckert [mailto:thomas.r.w.eck...@gmail.com] > *Sent:* Dienstag, 26. November 2013 17:11 > *To:* dev@httpd.apache.org > *Subject:* ap_proxy_location_reverse_map() > > > > I've been debugging some problems with incorrectly reverse mapped Location > headers and found some backend servers (e.g. OWA for Exchange 2013) to give > headers like > > > Location: https://myserver:443/path/file?query > > which I think are perfectly fine. mod proxy fails to do the trick because > > else { > const char *part = url; > l2 = strlen(real); > if (real[0] == '/') { > part = ap_strstr_c(url, "://"); > if (part) { > part = ap_strchr_c(part+3, '/'); > if (part) { > l1 = strlen(part); > } > else { > part = url; > } > } > else { > part = url; > } > } > > if (l1 >= l2 && strncasecmp(real, part, l2) == 0) { > u = apr_pstrcat(r->pool, ent[i].fake, &part[l2], NULL); > return ap_is_url(u) ? u : ap_construct_url(r->pool, u, r); > } > } > > which does not take the port behind the domain name into consideration > (note: simple example setup, fake path is just '/' obviously). I looked > over the code and got the feeling the same problem applies to the whole > section, not just that one strncasecmp() call. Since the port given by the > backend server is not much use to the reverse proxy at that point, we can > just drop it on the floor and continue, e.g. like this > > --- a/modules/proxy/proxy_util.c > +++ b/modules/proxy/proxy_util.c > @@ -894,11 +894,17 @@ PROXY_DECLARE(const char *) > ap_proxy_location_reverse_map(request_rec *r, > } > } > else if (l1 >= l2 && strncasecmp((*worker)->s->name, url, > l2) == 0) { > + const char* tmp_pchar = url + l2; > + if (url[l2] == ':') { > + tmp_pchar = ap_strchr_c(tmp_pchar, '/'); > + } > + > /* edge case where fake is just "/"... avoid double > slash */ > - if ((ent[i].fake[0] == '/') && (ent[i].fake[1] == 0) > && (url[l2] == '/')) { > - u = apr_pstrdup(r->pool, &url[l2]); > + if ((ent[i].fake[0] == '/') && (ent[i].fake[1] == 0) > && > + (tmp_pchar != NULL) && (tmp_pchar[0] == '/')) { > + u = apr_pstrdup(r->pool, tmp_pchar); > } else { > - u = apr_pstrcat(r->pool, ent[i].fake, &url[l2], > NULL); > + u = apr_pstrcat(r->pool, ent[i].fake, tmp_pchar + > 1, NULL); > } > return ap_is_url(u) ? u : ap_construct_url(r->pool, > u, r); > > As said above this most likely needs to be spread to the other cases in > that section as well. Anyone see problems with this ? > > >