]> granicus.if.org Git - apache/commitdiff
* Correctly obey ServerName / ServerAlias if the Host header from the
authorRuediger Pluem <rpluem@apache.org>
Sat, 17 Sep 2011 15:08:14 +0000 (15:08 +0000)
committerRuediger Pluem <rpluem@apache.org>
Sat, 17 Sep 2011 15:08:14 +0000 (15:08 +0000)
  request matches the VirtualHost address.

PR: 51709
Submitted by: Micha Lenk <micha lenk.info>
Reviewed by: rpluem

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1172002 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
server/vhost.c

diff --git a/CHANGES b/CHANGES
index b5c0fa82a0e74639e03f9dc185f8bacb2f54770b..95be63c5ccd54eaea9c40fd37ec4cc65e11785b5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,10 @@ Changes with Apache 2.3.15
      PR 51714. [Stefan Fritsch, Jim Jagielski, Ruediger Pluem, Eric Covener,
      <lowprio20 gmail.com>]
 
+  *) core: Correctly obey ServerName / ServerAlias if the Host header from the
+     request matches the VirtualHost address.
+     PR 51709. [Micha Lenk <micha lenk.info>]
+
   *) mod_unique_id: Use random number generator to initialize counter.
      PR 45110. [Stefan Fritsch]
 
index e3a201a4ddbfa8e20d2070bdcb8ae9e28fd83f27..6b9f4be1b2b985dd3b6debe636be1bd8632fd461 100644 (file)
@@ -860,9 +860,11 @@ static void check_hostalias(request_rec *r)
     const char *host = r->hostname;
     apr_port_t port;
     server_rec *s;
+    server_rec *virthost_s;
     server_rec *last_s;
     name_chain *src;
 
+    virthost_s = NULL;
     last_s = NULL;
 
     port = r->connection->local_addr->port;
@@ -889,23 +891,34 @@ static void check_hostalias(request_rec *r)
 
         s = src->server;
 
-        /* does it match the virthost from the sar? */
-        if (!strcasecmp(host, sar->virthost)) {
-            goto found;
-        }
-
-        if (s == last_s) {
-            /* we've already done ServerName and ServerAlias checks for this
-             * vhost
-             */
-            continue;
+        /* If we still need to do ServerName and ServerAlias checks for this
+         * server, do them now.
+         */
+        if (s != last_s) {
+            /* does it match any ServerName or ServerAlias directive? */
+            if (matches_aliases(s, host)) {
+                goto found;
+            }
         }
         last_s = s;
 
-        if (matches_aliases(s, host)) {
-            goto found;
+        /* Fallback: does it match the virthost from the sar? */
+        if (!strcasecmp(host, sar->virthost)) {
+            /* only the first match is used */
+            if (virthost_s == NULL) {
+                virthost_s = s;
+            }
         }
     }
+
+    /* If ServerName and ServerAlias check failed, we end up here.  If it
+     * matches a VirtualHost, virthost_s is set. Use that as fallback
+     */
+    if (virthost_s) {
+        s = virthost_s;
+        goto found;
+    }
+
     return;
 
 found: