You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Alan Post <ap...@interwoven.com> on 2001/02/03 06:38:33 UTC
[PATCH] 1.3: fix PR 3489, NoProxy/mod_rewrite problem
This patch is filed as a change request, PR #7143. I am running into this
problem, and would appreciate one of the mod_proxy developers taking a look at
the patch.
Thanks for the great software.
Alan Post
>Class: change-request
>Arrival-Date: Sun Jan 28 10:30:01 PST 2001
>Originator: apost@interwoven.com
>Release: apache-1.3_20010127111201
>Environment:
uname -a: SunOS oiler 5.6 Generic_105181-07 sun4u sparc SUNW,UltraSPARC-IIi-Engine
gcc 2.8.1
>Description:
NoProxy doesn't work properly with RewriteRule [P]. This is filed as PR 3489.
I believe there are two problems with NoProxy and mod_rewrite:
1. NoProxy looks at r->hostname, which is set from the original request, and
may not be correct after the RewriteRule. I propose fixing this by
invalidating r->hostname on RewriteRule [P], and on ProxyPass (for the
same reason).
2. If r->hostname is NULL, NoProxy looks at r->uri to extract the hostname
of the destination of the request. However, r->filename is what is
actually used to make the proxy request, and r->filename is what
RewriteRule [P] sets. I propose changing the NoProxy logic to use
r->filename instead of r->uri.
>How-To-Repeat:
I used a setup very similar to the one in PR 3489.
>Fix:
Here are diff -C3 outputs:
*** mod_proxy.c.orig Sun Jan 28 08:35:10 2001
--- mod_proxy.c Sun Jan 28 09:27:05 2001
***************
*** 195,206 ****
for (i = 0; i < conf->aliases->nelts; i++) {
len = alias_match(r->uri, ent[i].fake);
! if (len > 0) {
! r->filename = ap_pstrcat(r->pool, "proxy:", ent[i].real,
! r->uri + len, NULL);
! r->handler = "proxy-server";
! r->proxyreq = PROXY_PASS;
! return OK;
}
}
return DECLINED;
--- 195,207 ----
for (i = 0; i < conf->aliases->nelts; i++) {
len = alias_match(r->uri, ent[i].fake);
! if (len > 0) {
! r->filename = ap_pstrcat(r->pool, "proxy:", ent[i].real,
! r->uri + len, NULL);
! r->handler = "proxy-server";
! r->proxyreq = PROXY_PASS;
! r->hostname = NULL;
! return OK;
}
}
return DECLINED;
*** proxy_util.c.orig Sun Jan 28 08:35:26 2001
--- proxy_util.c Sun Jan 28 08:40:56 2001
***************
*** 906,915 ****
if (r->hostname != NULL)
return r->hostname;
! /* Set url to the first char after "scheme://" */
! if ((url = strchr(r->uri, ':')) == NULL
! || url[1] != '/' || url[2] != '/')
! return NULL;
url = ap_pstrdup(r->pool, &url[1]); /* make it point to "//", which is what proxy_canon_netloc expects */
--- 906,916 ----
if (r->hostname != NULL)
return r->hostname;
! /* Set url to the first char after "proxy:scheme://" */
! if ((url = strchr(r->filename, ':')) == NULL
! || (url = strchr(&url[1], ':')) == NULL
! || url[1] != '/' || url[2] != '/')
! return NULL;
url = ap_pstrdup(r->pool, &url[1]); /* make it point to "//", which is what proxy_canon_netloc expects */
*** mod_rewrite.c.orig Sun Jan 28 08:35:39 2001
--- mod_rewrite.c Sun Jan 28 08:38:11 2001
***************
*** 1963,1969 ****
* URL-to-filename handler to be sure mod_proxy is triggered
* for this URL later in the Apache API. But make sure it is
* a fully-qualified URL. (If not it is qualified with
! * ourself).
*/
if (p->flags & RULEFLAG_PROXY) {
fully_qualify_uri(r);
--- 1963,1970 ----
* URL-to-filename handler to be sure mod_proxy is triggered
* for this URL later in the Apache API. But make sure it is
* a fully-qualified URL. (If not it is qualified with
! * ourself). Invalidate the hostname field of the request,
! * since we may be heading to a different host.
*/
if (p->flags & RULEFLAG_PROXY) {
fully_qualify_uri(r);
***************
*** 1975,1980 ****
--- 1976,1982 ----
perdir, r->filename);
}
r->filename = ap_pstrcat(r->pool, "proxy:", r->filename, NULL);
+ r->hostname = NULL;
return 1;
}