From: Eric Covener Date: Mon, 2 Apr 2012 13:17:16 +0000 (+0000) Subject: backport r1308327 from trunk -- clarify RewriteBase example/info X-Git-Tag: 2.2.23~203 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ecbc10dcd1510746648c5e0ffcbaf3839bf3036d;p=thirdparty%2Fapache%2Fhttpd.git backport r1308327 from trunk -- clarify RewriteBase example/info git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@1308341 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/docs/manual/mod/mod_rewrite.xml b/docs/manual/mod/mod_rewrite.xml index 94ffbed91ae..19c472556b9 100644 --- a/docs/manual/mod/mod_rewrite.xml +++ b/docs/manual/mod/mod_rewrite.xml @@ -561,96 +561,48 @@ once! RewriteBase Sets the base URL for per-directory rewrites RewriteBase URL-path -See usage for information. +None directory.htaccess FileInfo -

The RewriteBase directive explicitly - sets the base URL for per-directory rewrites. As you will see - below, RewriteRule - can be used in per-directory config files - (.htaccess). In such a case, it will act locally, - stripping the local directory prefix before processing, and applying - rewrite rules only to the remainder. When processing is complete, the - prefix is automatically added back to the - path. The default setting is; RewriteBase physical-directory-path

- -

When a substitution occurs for a new URL, this module has - to re-inject the URL into the server processing. To be able - to do this it needs to know what the corresponding URL-prefix - or URL-base is. By default this prefix is the corresponding - filepath itself. However, for most websites, URLs are NOT - directly related to physical filename paths, so this - assumption will often be wrong! Therefore, you can - use the RewriteBase directive to specify the - correct URL-prefix.

- - If your webserver's URLs are not directly -related to physical file paths, you will need to use -RewriteBase in every .htaccess -file where you want to use RewriteRule directives. - - -

For example, assume the following per-directory config file:

+

The RewriteBase directive specifies the + URL prefix to be used for per-directory (htaccess) + RewriteRule directives that substitute a relative + path.

+

This directive is required when you use a relative path + in a substitution in per-directory (htaccess) context unless either + of the following conditions are true: +

+

+

In the example below, RewriteBase is necessary + to avoid rewriting to http://example.com/opt/myapp-1.2.3/welcome.html + since the resource was not relative to the document root. This + misconfiguration would normally cause the server to look for an "opt" + directory under the document root.

-#
-#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
-#  Remember: /abc/def is the physical path of /xyz, i.e., the server
-#            has a 'Alias /xyz /abc/def' directive e.g.
-#
-
+DocumentRoot /var/www/example.com
+Alias /myapp /opt/myapp-1.2.3
+<Directory /opt/myapp-1.2.3>
 RewriteEngine On
-
-#  let the server know that we were reached via /xyz and not
-#  via the physical path prefix /abc/def
-RewriteBase   /xyz
-
-#  now the rewriting rules
-RewriteRule   ^oldstuff\.html$  newstuff.html
+RewriteBase /myapp/
+RewriteRule ^index\.html$  welcome.html 
+</Directory>
 
- -

In the above example, a request to - /xyz/oldstuff.html gets correctly rewritten to - the physical file /abc/def/newstuff.html.

- -For Apache Hackers -

The following list gives detailed information about - the internal processing steps:

-
-Request:
-  /xyz/oldstuff.html
-
-Internal Processing:
-  /xyz/oldstuff.html     -> /abc/def/oldstuff.html  (per-server Alias)
-  /abc/def/oldstuff.html -> /abc/def/newstuff.html  (per-dir    RewriteRule)
-  /abc/def/newstuff.html -> /xyz/newstuff.html      (per-dir    RewriteBase)
-  /xyz/newstuff.html     -> /abc/def/newstuff.html  (per-server Alias)
-
-Result:
-  /abc/def/newstuff.html
-
-

This seems very complicated, but is in fact - correct Apache internal processing. Because the - per-directory rewriting comes late in the - process, the rewritten request - has to be re-injected into the Apache kernel, as if it - were a new request. (See mod_rewrite technical - details.) - This is not the serious overhead it may seem to be - - this re-injection is completely internal to the - Apache server (and the same procedure is used by - many other operations within Apache).

-
-
-