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;
      }