From: Rich Bowen Date: Mon, 10 Oct 2011 12:46:21 +0000 (+0000) Subject: Rewrites the 'API Phases' section to give a brief intro to what an API X-Git-Tag: 2.3.15~137 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6f3913b0bfa83d335c5f3d4aaa4ac8908a2510a6;p=apache Rewrites the 'API Phases' section to give a brief intro to what an API Phase is, and how mod_rewrite handles rewrite rules in two different phases. Removes some of the condescending tone. References https://issues.apache.org/bugzilla/show_bug.cgi?id=30021 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1180925 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/docs/manual/rewrite/tech.xml b/docs/manual/rewrite/tech.xml index 27c6aea548..5aa5408cba 100644 --- a/docs/manual/rewrite/tech.xml +++ b/docs/manual/rewrite/tech.xml @@ -39,81 +39,81 @@ and URL matching.

Advanced techniques When not to use mod_rewrite -
Internal Processing - -

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.

-
-
API Phases -

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:

- -
    -
  1. Although mod_rewrite rewrites URLs to URLs, URLs to - filenames and even filenames to filenames, the API - currently provides only a URL-to-filename hook. In Apache - 2.0 the two missing hooks will be added to make the - processing more clear. But this point has no drawbacks for - the user, it is just a fact which should be remembered: - Apache does more in the URL-to-filename hook than the API - intends for it.
  2. - -
  3. - Unbelievably mod_rewrite provides URL manipulations in - per-directory context, i.e., within - .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.

    -
  4. -
- -

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 Virtualhost + sections.) This happens in the URL-to-filename phase.

+ +

A few steps later, when the finaly data directories are found, + the per-directory configuration directives (.htaccess + files and Directory blocks) are applied. This + happens in the Fixup phase.

+ +

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 + RewriteBase directive to + see how you can further manipulate how this is handled.) Then, a new + internal subrequest is issued with the new URI. This restarts + processing of the API phases.

+ +

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 ruleRule
VirtualHost sectionRewriteRule ^/images/(.+)\.jpg /images/$1.gif
.htaccess file in document rootRewriteRule ^images/(.+)\.jpg images/$1.gif
.htaccess file in images directoryRewriteRule ^(.+)\.jpg $1.gif
+
Ruleset Processing