From: Rich Bowen
The internal processing of this module is very complex but - needs to be explained once even to the average user to avoid - common mistakes and to let you exploit its full - functionality.
-First you have to understand that when Apache processes a
- HTTP request it does this in phases. A hook for each of these
- phases is provided by the Apache API. Mod_rewrite uses two of
- these hooks: the URL-to-filename translation hook which is
- used after the HTTP request has been read but before any
- authorization starts and the Fixup hook which is triggered
- after the authorization phases and after the per-directory
- config files (.htaccess
) have been read, but
- before the content handler is activated.
So, after a request comes in and Apache has determined the - corresponding server (or virtual server) the rewriting engine - starts processing of all mod_rewrite directives from the - per-server configuration in the URL-to-filename phase. A few - steps later when the final data directories are found, the - per-directory configuration directives of mod_rewrite are - triggered in the Fixup phase. In both situations mod_rewrite - rewrites URLs either to new URLs or to filenames, although - there is no obvious distinction between them. This is a usage - of the API which was not intended to be this way when the API - was designed, but as of Apache 1.x this is the only way - mod_rewrite can operate. To make this point more clear - remember the following two points:
- -.htaccess
files, although these are reached
- a very long time after the URLs have been translated to
- filenames. It has to be this way because
- .htaccess
files live in the filesystem, so
- processing has already reached this stage. In other
- words: According to the API phases at this time it is too
- late for any URL manipulations. To overcome this chicken
- and egg problem mod_rewrite uses a trick: When you
- manipulate a URL/filename in per-directory context
- mod_rewrite first rewrites the filename back to its
- corresponding URL (which is usually impossible, but see
- the RewriteBase
directive below for the
- trick to achieve this) and then initiates a new internal
- sub-request with the new URL. This restarts processing of
- the API phases.
-
- Again mod_rewrite tries hard to make this complicated - step totally transparent to the user, but you should - remember here: While URL manipulations in per-server - context are really fast and efficient, per-directory - rewrites are slow and inefficient due to this chicken and - egg problem. But on the other hand this is the only way - mod_rewrite can provide (locally restricted) URL - manipulations to the average user.
-Don't forget these two points!
+The Apache HTTP Server handles requests in several phases. At + each of these phases, one or more modules may be called upon to + handle that portion of the request lifecycle. Phases include things + like URL-to-filename translation, authentication, authorization, + content, and logging. (These is not an exhaustive list.)
+ +mod_rewrite acts in two of these phases (or "hooks", as they are + sometimes called) to influence how URLs may be rewritten.
+ +First, it uses the URL-to-filename translation hook, which occurs
+ after the HTTP request has been read, but before any authorization
+ starts. Secondly, it uses the Fixup hook, which is after the
+ authorizatin phases, and after per-directory configuration files
+ (.htaccess
files) have been read, but before the
+ content handler is called.
So, after a request comes in and a corresponding server or
+ virtual host has been determined, the rewriting engine starts
+ processing any mod_rewrite
directives appearing in the
+ per-server configuration. (ie, in the main server configuration file
+ and
A few steps later, when the finaly data directories are found,
+ the per-directory configuration directives (.htaccess
+ files and
In each of these cases, mod_rewrite rewrites the
+ REQUEST_URI
either to a new URI, or to a filename.
In per-directory context (ie, within .htaccess
files
+ and Directory
blocks), these rules are being applied
+ after a URI has already been translated to a filename. Because of
+ this, mod_rewrite temporarily translates the filename back into a URI,
+ by stripping off directory paty before appling the rules. (See the
+
Because of this further manipulation of the URI in per-directory + context, you'll need to take care to craft your rewrite rules + differently in that context. In particular, remember that the + leading directory path will be stripped off of the URI that your + rewrite rules will see. Consider the examples below for further + clarification.
+ +Location of rule | +Rule | +
---|---|
VirtualHost section | +RewriteRule ^/images/(.+)\.jpg /images/$1.gif | +
.htaccess file in document root | +RewriteRule ^images/(.+)\.jpg images/$1.gif | +
.htaccess file in images directory | +RewriteRule ^(.+)\.jpg $1.gif | +