You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by co...@apache.org on 2017/01/30 12:59:09 UTC

svn commit: r1780909 - /httpd/httpd/trunk/modules/proxy/mod_proxy.c

Author: covener
Date: Mon Jan 30 12:59:09 2017
New Revision: 1780909

URL: http://svn.apache.org/viewvc?rev=1780909&view=rev
Log:
"fix" regression in r1773397.

committing for discussion purposes to trunk.  I have reopened PR60458 because
I am tempted to revert the entire thing, it was not really a release-to-release
regression because the reporter arbitrarily used a new 2.4 syntax and the semantics
were unclear.

It is useful to have global exceptions apply to per-location proxypass, but it totally
breaks the "fast" lookup part of it.


Modified:
    httpd/httpd/trunk/modules/proxy/mod_proxy.c

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1780909&r1=1780908&r2=1780909&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Mon Jan 30 12:59:09 2017
@@ -794,16 +794,23 @@ static int proxy_trans(request_rec *r)
     if (dconf->alias) {
         int rv = ap_proxy_trans_match(r, dconf->alias, dconf);
         if (OK == rv) { 
+            int matches = 0;
             /* Got a hit. Need to make sure it's not explicitly declined */
             if (conf->aliases->nelts) {
                 ent = (struct proxy_alias *) conf->aliases->elts;
                 for (i = 0; i < conf->aliases->nelts; i++) {
                     int rv = ap_proxy_trans_match(r, &ent[i], dconf);
+                    if (OK == rv) matches++;
                     if (DECLINED == rv) { 
                         return DECLINED;
                     }
                 }
             }
+
+            /* a non !-rule matches in server scope, restore */
+            if (matches > 0) {
+                ap_proxy_trans_match(r, dconf->alias, dconf);
+            }
             return OK; 
         }
         if (DONE != rv) {