Consider the following httpd.conf file:

    ServerName localhost:80
    Listen 127.0.0.1:80
    DocumentRoot "/var/www/html"
    DirectoryIndex index.html

There's a /var/www/html/index.html file that contains a simple test message.

Now, say that (for whatever reason) we want to redirect all requests
for any URL-path except / (root) to the root.

You should be able to do that with a RedirectMatch:

    RedirectMatch permanent ^/.+$ http://localhost/

Or you could do it using mod_rewrite:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/$
    RewriteRule .* http://localhost/ [redirect=permanent,last]

But either approach will, in fact, fail: *all* URL-paths will return a
redirect to the root, including the root itself.

If you enable RewriteLog and crank up the RewriteLogLevel, you can see
what is happening:

127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#555556458dd8/initial] (2) init rewrite engine 
with requested uri /
127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#555556458dd8/initial] (3) applying pattern 
'.*' to uri '/'
127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#555556458dd8/initial] (1) pass through /
127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#55555645ee08/subreq] (2) init rewrite engine 
with requested uri /index.html
127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#55555645ee08/subreq] (1) pass through 
/index.html
127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#555556465f48/initial/redir#1] (2) init rewrite 
engine with requested uri /index.html
127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#555556465f48/initial/redir#1] (3) applying 
pattern '.*' to uri '/index.html'
127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#555556465f48/initial/redir#1] (2) rewrite 
'/index.html' -> 'http://localhost/'
127.0.0.1 - - [05/Sep/2007:19:21:44 --0400] 
[localhost/sid#5555557b2d30][rid#555556465f48/initial/redir#1] (2) explicitly 
forcing redirect with http://localhost/

In English, this means that although / is properly excluded from the
rewrite, when httpd finds index.html (via the DirectoryIndex
directive), and logically "applies" it to the client's request, the
result is also subject to being written via RedirectMatch/mod_rewrite,
even though the client never included "index.html" in the original
URL-path.

I think this is either a bug with the server, or a bug with the
documentation.  The documentation for RedirectMatch and mod_rewrite
are both explicitly clear that the match is against the URL-path,
which is defined in "Terms Used to Describe Directives" as:

    URL-path:

    The part of a url which follows the scheme and hostname as in
    /path/to/file.html. The url-path represents a web-view of a
    resource, as opposed to a file-system view.

But this is not the behavior of RedirectMatch/mod_rewrite; they are in
fact matching not just the URL-path, but a quasi-expansion of the
client's request that is somewhere in between URL-path and file-path.
(I've tested both httpd 2.0 and 2.2; they both exhibit this behavior.)

If that's the intended behavior, then the documentation is wrong; if
that's not the intended behavior, then this is a bug with the server.

Comments?

(If I receive no dissuading comments within a few days, I'll file this
as a bug via Bugzilla.)

Thanks...


---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: [EMAIL PROTECTED]
   "   from the digest: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to