From: Eric Covener The 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 For example, assume the following per-directory config file: The 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:
+
- Description: Sets the base URL for per-directory rewrites
-Syntax: RewriteBase URL-path
+Default: See usage for information.
Default: None
Context: directory, .htaccess Override: FileInfo Status: Extension Module: mod_rewrite 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-pathRewriteBase
directive to specify the
- correct URL-prefix.RewriteBase
in every .htaccess
-file where you want to use RewriteRule
directives.
-RewriteBase
directive specifies the
+ URL prefix to be used for per-directory (htaccess)
+ RewriteRule
directives that substitute a relative
+ path.
+
+ DocumentRoot
+ (as opposed to reachable by other means, such as
+ Alias
).RewriteRule
, suffixed by the relative
+ substitution is also valid as a URL path on the server
+ (this is rare).
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
.
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).
-There are various statically declared buffers of fixed length. Combined - with the lazy parsing of the command line arguments, the response headers - from the server and other external inputs, this might bite you.
- -It does not implement HTTP/1.x fully; only accepts some 'expected' forms
- of responses. The rather heavy use of strstr(3)
shows up top
- in profile, which might indicate a performance problem; i.e., you
- would measure the ab
performance rather than the server's.
Sample output is provided here.
-Server Software: Apache/2.2.17 -Server Hostname: testserver.com -Server Port: 80 - -Document Path: /index.html -Document Length: 787 bytes - -Concurrency Level: 5 -Time taken for tests: 0.436 seconds -Complete requests: 1000 -Failed requests: 0 -Write errors: 0 -Total transferred: 1026000 bytes -HTML transferred: 787000 bytes -Requests per second: 2292.26 [#/sec] (mean) -Time per request: 2.181 [ms] (mean) -Time per request: 0.436 [ms] (mean, across all concurrent requests) -Transfer rate: 2296.74 [Kbytes/sec] received - -Connection Times (ms) - min mean[+/-sd] median max -Connect: 0 1 0.4 1 3 -Processing: 1 1 0.4 1 3 -Waiting: 0 1 0.5 1 2 -Total: 2 2 0.1 2 3 - -Percentage of the requests served within a certain time (ms) - 50% 2 - 66% 2 - 75% 2 - 80% 2 - 90% 2 - 95% 2 - 98% 2 - 99% 3 - 100% 3 (longest request)
The output may vary depending on the command line parameters given. Possible output with a brief explanation of each element is listed below.
@@ -338,6 +288,17 @@ Percentage of the requests served within a certain time (ms)totalread / 1024 / timetaken
There are various statically declared buffers of fixed length. Combined + with the lazy parsing of the command line arguments, the response headers + from the server and other external inputs, this might bite you.
+ +It does not implement HTTP/1.x fully; only accepts some 'expected' forms
+ of responses. The rather heavy use of strstr(3)
shows up top
+ in profile, which might indicate a performance problem; i.e., you
+ would measure the ab
performance rather than the server's.
Available Languages: en |