dgaudet 98/03/06 01:37:11
Modified: src CHANGES src/main http_request.c htdocs/manual upgrading_to_1_3.html htdocs/manual/mod core.html Log: Change to the multiple-slash behaviour of LocationMatch for consistency with AliasMatch and RewriteRule. This was discussed in nh.9711, search for subject "mod_rewrite/1440". My proposed change had the support of Roy, Ken and Dirk... I modified it slightly here so that it wouldn't break every single existing config that has <Location /server-status>. PR: 1440 Revision Changes Path 1.691 +10 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.690 retrieving revision 1.691 diff -u -r1.690 -r1.691 --- CHANGES 1998/03/06 08:51:58 1.690 +++ CHANGES 1998/03/06 09:37:04 1.691 @@ -1,5 +1,15 @@ Changes with Apache 1.3b6 + *) Change to Location and LocationMatch semantics. LocationMatch no + longer lets a single slash match multiple adjacent slashes in the + URL. This change is for consistency with RewriteRule and + AliasMatch. Multiple slashes have meaning in URLs that they do + not have in (some) filesystems. Location on the other hand can + be considered a shorthand for a more complicated regex, and it + does match multiple slashes with a single slash -- which is + also consistent with the Alias directive. + [Dean Gaudet] related PR#1440 + *) Fix bug with mod_mime_magic causing certain files, including files of length 0, to result in no response from the server. [Dean Gaudet] 1.111 +12 -7 apache-1.3/src/main/http_request.c Index: http_request.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/main/http_request.c,v retrieving revision 1.110 retrieving revision 1.111 diff -u -r1.110 -r1.111 --- http_request.c 1998/03/06 08:26:18 1.110 +++ http_request.c 1998/03/06 09:37:06 1.111 @@ -509,13 +509,18 @@ return OK; } - /* - * Collapse multiple slashes, if it's a path URL (we don't want to do - * anything to <Location http://...> or such). + /* Location and LocationMatch differ on their behaviour w.r.t. multiple + * slashes. Location matches multiple slashes with a single slash, + * LocationMatch doesn't. An exception, for backwards brokenness is + * absoluteURIs... in which case neither match multiple slashes. */ - test_location = pstrdup(r->pool, r->uri); - if (test_location[0] == '/') - no2slash(test_location); + if (r->uri[0] != '/') { + test_location = r->uri; + } + else { + test_location = pstrdup(r->pool, r->uri); + no2slash(test_location); + } /* Go through the location entries, and check for matches. */ @@ -535,7 +540,7 @@ this_conf = NULL; if (entry_core->r) { - if (!regexec(entry_core->r, test_location, 0, NULL, 0)) + if (!regexec(entry_core->r, r->uri, 0, NULL, 0)) this_conf = entry_config; } else if (entry_core->d_is_fnmatch) { 1.14 +5 -1 apache-1.3/htdocs/manual/upgrading_to_1_3.html Index: upgrading_to_1_3.html =================================================================== RCS file: /export/home/cvs/apache-1.3/htdocs/manual/upgrading_to_1_3.html,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- upgrading_to_1_3.html 1998/02/18 10:00:57 1.13 +++ upgrading_to_1_3.html 1998/03/06 09:37:07 1.14 @@ -77,7 +77,7 @@ AuthName "This and That" </PRE> </P> - This change was made for HTTP/1.1 compliance. + This change was made for consistency in the config language. <LI><STRONG>The default Apache ServerRoot directory changed</STRONG> from the NCSA-compatible <SAMP>/usr/local/etc/httpd/</SAMP> to <SAMP>/usr/local/apache/</SAMP>. This change covers only the default @@ -131,6 +131,10 @@ inconsistancies, and was removed. To emulate this older behaviour use a <Files> section nested inside a <Directory> section. + + <li><Location> matching behaviour with respect to slashes has + changed. See the <a href="mod/core.html#location"><Location> + documentation</a> for more info. </UL> 1.104 +40 -16 apache-1.3/htdocs/manual/mod/core.html Index: core.html =================================================================== RCS file: /export/home/cvs/apache-1.3/htdocs/manual/mod/core.html,v retrieving revision 1.103 retrieving revision 1.104 diff -u -r1.103 -r1.104 --- core.html 1998/02/20 06:52:03 1.103 +++ core.html 1998/03/06 09:37:08 1.104 @@ -1312,35 +1312,42 @@ 1.1 and later.<P> <P>The <Location> directive provides for access control by -URL. It is comparable to the <A +URL. It is similar to the <A HREF="#directory"><Directory></A> directive, and -should be matched with a </Location> directive. Directives that -apply to the URL given should be listed -within. <CODE><Location></CODE> sections are processed in the +starts a subsection which is terminated with a </Location> +directive. <CODE><Location></CODE> sections are processed in the order they appear in the configuration file, after the <Directory> sections and <CODE>.htaccess</CODE> files are -read.</P> +read, and after the <Files> sections.</P> -<P>Note that, due to the way HTTP functions, <EM>URL prefix</EM> -should, save for proxy requests, be of the form <CODE>/path/</CODE>, -and should not include the <CODE>http://servername</CODE>. It doesn't -necessarily have to protect a directory (it can be an individual -file, or a number of files), and can include wild-cards. In a wild-card -string, `?' matches any single character, and `*' matches any -sequences of characters. +<p>Note that URLs do not have to line up with the filesystem at all, +it should be emphasized that <Location> operates completely outside +the filesystem. + +<p>For all origin (non-proxy) requests, the URL to be matched is +of the form <code>/path/</code>, and you should not include any +<code>http://servername</code> prefix. For proxy requests, the URL +to be matched is of the form <code>scheme://servername/path</code>, +and you must include the prefix. + +<p>The URL may use wildcards In a wild-card string, `?' matches any +single character, and `*' matches any sequences of characters. <P><STRONG>Apache 1.2 and above:</STRONG> Extended regular expressions can also be used, with the addition of -the -<CODE>~</CODE> character. For example:</P> +the <CODE>~</CODE> character. + +For example:</P> <PRE> <Location ~ "/(extra|special)/data"> </PRE> <P>would match URLs that contained the substring "/extra/data" or -"/special/data". However, in Apache 1.3 and above, use of <A -HREF="#locationmatch"><LocationMatch></A> is preferred.</P> +"/special/data". In Apache 1.3 and above, a new directive +<A HREF="#locationmatch"><LocationMatch></A> exists which +behaves identical to the regex version of +<code><Location></code>. <P>The <CODE>Location</CODE> functionality is especially useful when combined with the <CODE><A @@ -1355,6 +1362,23 @@ allow from .foo.com </Location> </PRE> + +<p><strong>Apache 1.3 and above note about / (slash)</strong>: The slash character has special +meaning depending on where in a URL it appears. People may be used +to its behaviour in the filesystem where multiple adjacent slashes are +frequently collapsed to a single slash (i.e. <code>/home///foo</code> +is the same as <code>/home/foo</code>). In URL-space this is not +necessarily true. The <code><LocationMatch></code> directive +and the regex version of <code><Location></code> require you +to explicitly specify multiple slashes if that is your intention. +For example, <code><LocationMatch ^/abc></code> would match the +request URL <code>/abc</code> but not the request URL <code>//abc</code>. +The (non-regex) <code><Location></code> directive behaves +similarly when used for proxy requests. But when (non-regex) +<code><Location></code> is used for non-proxy requests it will +implicitly match multiple slashes with a single slash. For example, +if you specify <code><Location /abc/def></code> and the request +is to <code>/abc//def</code> then it will match. <P> <STRONG>See also</STRONG>: <A HREF="../sections.html">How Directory,