]> granicus.if.org Git - apache/blob - docs/manual/mod/mod_rewrite.xml
PR 39313: allow the user to configure which rules come first when RewriteRules
[apache] / docs / manual / mod / mod_rewrite.xml
1 <?xml version="1.0"?>
2 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
4 <!-- $LastChangedRevision$ -->
5
6 <!--
7  Licensed to the Apache Software Foundation (ASF) under one or more
8  contributor license agreements.  See the NOTICE file distributed with
9  this work for additional information regarding copyright ownership.
10  The ASF licenses this file to You under the Apache License, Version 2.0
11  (the "License"); you may not use this file except in compliance with
12  the License.  You may obtain a copy of the License at
13
14      http://www.apache.org/licenses/LICENSE-2.0
15
16  Unless required by applicable law or agreed to in writing, software
17  distributed under the License is distributed on an "AS IS" BASIS,
18  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  See the License for the specific language governing permissions and
20  limitations under the License.
21 -->
22
23 <modulesynopsis metafile="mod_rewrite.xml.meta">
24
25 <name>mod_rewrite</name>
26
27 <description>Provides a rule-based rewriting engine to rewrite requested
28 URLs on the fly</description>
29
30 <status>Extension</status>
31 <sourcefile>mod_rewrite.c</sourcefile>
32 <identifier>rewrite_module</identifier>
33
34 <summary>
35         <p>The <module>mod_rewrite</module> module uses a rule-based rewriting 
36       engine, based on a regular-expression parser, to rewrite requested URLs on
37       the fly. By default, <module>mod_rewrite</module> maps a URL to a filesystem 
38       path. However, it can also be used to redirect one URL to another URL, or
39       to invoke an internal proxy fetch.</p>
40       <p><module>mod_rewrite</module> provides a flexible and powerful way to 
41       manipulate URLs using an unlimited number of rules. Each rule can have an 
42       unlimited number of attached rule conditions, to allow you to rewrite URL
43       based on server variables, environment variables, HTTP headers, or time 
44       stamps.</p>
45       <p><module>mod_rewrite</module> operates on the full URL path, including the
46       path-info section. A rewrite rule can be invoked in 
47       <code>httpd.conf</code> or in <code>.htaccess</code>. The path generated 
48       by a rewrite rule can include a query string, or can lead to internal 
49       sub-processing, external request redirection, or internal proxy 
50       throughput.</p>
51
52       <p>Further details, discussion, and examples, are provided in the
53       <a href="../rewrite/">detailed mod_rewrite documentation</a>.</p>
54 </summary>
55
56 <section id="logging"><title>Logging</title>
57
58     <p><module>mod_rewrite</module> offers detailed logging of its actions
59     at the <code>trace1</code> to <code>trace8</code> log levels. The
60     log level can be set specifically for <module>mod_rewrite</module>
61     using the <directive module="core">LogLevel</directive> directive: Up to
62     level <code>debug</code>, no actions are logged, while <code>trace8</code>
63     means that practically all actions are logged.</p>
64
65     <note>
66       Using a high trace log level for <module>mod_rewrite</module>
67       will slow down your Apache HTTP Server dramatically! Use a log
68       level higher than <code>trace2</code> only for debugging!
69     </note>
70
71     <example><title>Example</title>
72       LogLevel alert rewrite:trace3
73     </example>
74
75     <note><title>RewriteLog</title>
76       <p>Those familiar with earlier versions of
77       <module>mod_rewrite</module> will no doubt be looking for the
78       <code>RewriteLog</code> and <code>RewriteLogLevel</code>
79       directives. This functionality has been completely replaced by the
80       new per-module logging configuration mentioned above.
81       </p>
82
83       <p>To get just the <module>mod_rewrite</module>-specific log
84       messages, pipe the log file through grep:</p>
85     <example>
86     tail -f error_log|fgrep '[rewrite:'
87     </example>
88     </note>
89
90 </section>
91
92 <directivesynopsis>
93 <name>RewriteEngine</name>
94 <description>Enables or disables runtime rewriting engine</description>
95 <syntax>RewriteEngine on|off</syntax>
96 <default>RewriteEngine off</default>
97 <contextlist><context>server config</context><context>virtual host</context>
98 <context>directory</context><context>.htaccess</context></contextlist>
99 <override>FileInfo</override>
100
101 <usage>
102
103       <p>The <directive>RewriteEngine</directive> directive enables or
104       disables the runtime rewriting engine. If it is set to
105       <code>off</code> this module does no runtime processing at
106       all. It does not even update the <code>SCRIPT_URx</code>
107       environment variables.</p>
108
109       <p>Use this directive to disable the module instead of
110       commenting out all the <directive
111       module="mod_rewrite">RewriteRule</directive> directives!</p>
112
113       <p>Note that rewrite configurations are not
114       inherited by virtual hosts. This means that you need to have a
115       <code>RewriteEngine on</code> directive for each virtual host
116       in which you wish to use rewrite rules.</p>
117
118       <p><directive>RewriteMap</directive> directives of the type <code>prg</code>
119       are not started during server initialization if they're defined in a
120       context that does not have <directive>RewriteEngine</directive>  set to
121       <code>on</code></p>
122 </usage>
123
124 </directivesynopsis>
125
126 <directivesynopsis>
127 <name>RewriteOptions</name>
128 <description>Sets some special options for the rewrite engine</description>
129 <syntax>RewriteOptions <var>Options</var></syntax>
130 <contextlist><context>server config</context><context>virtual host</context>
131 <context>directory</context><context>.htaccess</context></contextlist>
132 <override>FileInfo</override>
133 <compatibility><code>MaxRedirects</code> is no longer available in version 2.1 and
134 later</compatibility>
135 <usage>
136
137       <p>The <directive>RewriteOptions</directive> directive sets some
138       special options for the current per-server or per-directory
139       configuration. The <em>Option</em> string can currently
140       only be one of the following:</p>
141
142       <dl>
143       <dt><code>Inherit</code></dt>
144       <dd>
145       
146       <p>This forces the current configuration to inherit the
147       configuration of the parent. In per-virtual-server context,
148       this means that the maps, conditions and rules of the main
149       server are inherited. In per-directory context this means
150       that conditions and rules of the parent directory's
151       <code>.htaccess</code> configuration or
152       <directive type="section" module="core">Directory</directive>
153       sections are inherited. The inherited rules are virtually copied
154       to the section where this directive is being used. If used in
155       combination with local rules, the inherited rules are copied behind
156       the local rules. The position of this directive - below or above
157       of local rules - has no influence on this behavior. If local
158       rules forced the rewriting to stop, the inherited rules won't
159       be processed.</p>
160      
161       <note type="warning">
162       Rules inherited from the parent scope are applied
163       <strong>after</strong> rules specified in the child scope.
164       </note>
165       </dd>
166
167       <dt><code>InheritBefore</code></dt>
168       <dd>
169       <p> Like <code>Inherit</code> above, but the rules from the parent scope
170       are applied <strong>after</strong> rules specified in the child scope.  
171       Available in Apache HTTP Server 2.3.10 and later.</p>
172       </dd>
173       
174       </dl>
175
176 </usage>
177
178 </directivesynopsis>
179
180 <directivesynopsis>
181 <name>RewriteMap</name>
182 <description>Defines a mapping function for key-lookup</description>
183 <syntax>RewriteMap <em>MapName</em> <em>MapType</em>:<em>MapSource</em>
184 </syntax>
185 <contextlist><context>server config</context><context>virtual host</context>
186 </contextlist>
187 <compatibility>The choice of different dbm types is available in
188 Apache HTTP Server 2.0.41 and later</compatibility>
189
190 <usage>
191       <p>The <directive>RewriteMap</directive> directive defines a
192       <em>Rewriting Map</em> which can be used inside rule
193       substitution strings by the mapping-functions to
194       insert/substitute fields through a key lookup. The source of
195       this lookup can be of various types.</p>
196
197       <p>The <a id="mapfunc" name="mapfunc"><em>MapName</em></a> is
198       the name of the map and will be used to specify a
199       mapping-function for the substitution strings of a rewriting
200       rule via one of the following constructs:</p>
201
202       <p class="indent">
203         <strong><code>${</code> <em>MapName</em> <code>:</code>
204         <em>LookupKey</em> <code>}</code><br />
205          <code>${</code> <em>MapName</em> <code>:</code>
206         <em>LookupKey</em> <code>|</code> <em>DefaultValue</em>
207         <code>}</code></strong>
208       </p>
209
210       <p>When such a construct occurs, the map <em>MapName</em> is
211       consulted and the key <em>LookupKey</em> is looked-up. If the
212       key is found, the map-function construct is substituted by
213       <em>SubstValue</em>. If the key is not found then it is
214       substituted by <em>DefaultValue</em> or by the empty string
215       if no <em>DefaultValue</em> was specified. Empty values
216       behave as if the key was absent, therefore it is not possible
217       to distinguish between empty-valued keys and absent keys.</p>
218
219       <p>For example, you might define a
220       <directive>RewriteMap</directive> as:</p>
221
222       <example>
223       RewriteMap examplemap txt:/path/to/file/map.txt
224       </example>
225
226       <p>You would then be able to use this map in a
227       <directive>RewriteRule</directive> as follows:</p>
228
229       <example>
230       RewriteRule ^/ex/(.*) ${examplemap:$1}
231       </example>
232
233       <p>The following combinations for <em>MapType</em> and
234       <em>MapSource</em> can be used:</p>
235
236     <dl>
237
238     <dt>txt</dt>
239         <dd>A plain text file containing space-separated key-value
240         pairs, one per line. (<a href="../rewrite/rewritemap.html#txt">Details ...</a>)</dd>
241
242     <dt>rnd</dt>
243         <dd>Randomly selects an entry from a plain text file (<a href="../rewrite/rewritemap.html#rnd">Details ...</a>)</dd>
244
245     <dt>dbm</dt>
246         <dd>Looks up an entry in a dbm file containing name, value
247         pairs. Hash is constructed from a plain text file format using
248         the <code><a href="../programs/httxt2dbm.html">httxt2dbm</a></code> 
249         utility.  (<a href="../rewrite/rewritemap.html#dbm">Details ...</a>)</dd>
250
251     <dt>int</dt>
252         <dd>One of the four available internal functions provided by
253         <code>RewriteMap</code>: toupper, tolower, escape or
254         unescape. (<a href="../rewrite/rewritemap.html#int">Details ...</a>)</dd>
255
256     <dt>prg</dt>
257         <dd>Calls an external program or script to process the
258         rewriting. (<a href="../rewrite/rewritemap.html#prg">Details ...</a>)</dd>
259
260     <dt>dbd or fastdbd</dt>
261         <dd>A SQL SELECT statement to be performed to look up the
262         rewrite target. (<a href="../rewrite/rewritemap.html#dbd">Details ...</a>)</dd>
263     </dl>
264
265     <p>Further details, and numerous examples, may be found in the <a
266     href="../rewrite/rewritemap.html">RewriteMap HowTo</a></p>
267
268 </usage>
269 </directivesynopsis>
270
271 <directivesynopsis>
272 <name>RewriteBase</name>
273 <description>Sets the base URL for per-directory rewrites</description>
274 <syntax>RewriteBase <em>URL-path</em></syntax>
275 <default>None</default>
276 <contextlist><context>directory</context><context>.htaccess</context>
277 </contextlist>
278 <override>FileInfo</override>
279
280 <usage>
281       <p>The <directive>RewriteBase</directive> directive explicitly
282       sets the base URL-path (not filesystem directory path!)  for per-directory rewrites.
283       When you use a <directive module="mod_rewrite">RewriteRule</directive>
284       in a <code>.htaccess</code> file, <module>mod_rewrite</module> strips off
285       the local directory prefix before processing, then rewrites the rest of 
286       the URL. When the rewrite is completed, <module>mod_rewrite</module>
287       automatically adds the local directory prefix back on to the path.</p>
288       
289       <p>This directive is <em>required</em> for per-directory rewrites whose context
290       is a directory made available via the <directive module="mod_alias">Alias</directive>
291       directive.</p>
292
293       <p>If your URL path does not exist verbatim on the filesystem,
294       or isn't directly under your <directive module="core">DocumentRoot</directive>,
295       you must use <directive>RewriteBase</directive> in every
296       <code>.htaccess</code> file where you want to use <directive
297       module="mod_rewrite">RewriteRule</directive> directives.</p>
298
299       <p>The example below demonstrates how to map 
300       http://example.com/myapp/index.html to 
301       /home/www/example/newsite.html, in a <code>.htaccess</code> file. This 
302       assumes that the content available at
303       http://example.com/ is on disk at /home/www/example/</p>
304 <example>
305 <pre>
306 RewriteEngine On
307 # The URL-path used to get to this context, not the filesystem path
308 RewriteBase /myapp/
309 RewriteRule ^index\.html$  newsite.html
310 </pre>
311 </example>
312
313 </usage>
314
315 </directivesynopsis>
316
317 <directivesynopsis>
318 <name>RewriteCond</name>
319 <description>Defines a condition under which rewriting will take place
320 </description>
321 <syntax> RewriteCond
322       <em>TestString</em> <em>CondPattern</em></syntax>
323 <contextlist><context>server config</context><context>virtual host</context>
324 <context>directory</context><context>.htaccess</context></contextlist>
325 <override>FileInfo</override>
326
327 <usage>
328       <p>The <directive>RewriteCond</directive> directive defines a
329       rule condition. One or more <directive>RewriteCond</directive>
330       can precede a <directive module="mod_rewrite">RewriteRule</directive>
331       directive. The following rule is then only used if both
332       the current state of the URI matches its pattern, <strong
333       >and</strong> if these conditions are met.</p>
334
335       <p><em>TestString</em> is a string which can contain the
336       following expanded constructs in addition to plain text:</p>
337
338       <ul>
339         <li>
340           <strong>RewriteRule backreferences</strong>: These are
341           backreferences of the form <strong><code>$N</code></strong>
342           (0 &lt;= N &lt;= 9). $1 to $9 provide access to the grouped
343           parts (in parentheses) of the pattern, from the
344           <code>RewriteRule</code> which is subject to the current
345           set of <code>RewriteCond</code> conditions. $0 provides
346           access to the whole string matched by that pattern.
347         </li>
348         <li>
349           <strong>RewriteCond backreferences</strong>: These are
350           backreferences of the form <strong><code>%N</code></strong>
351           (0 &lt;= N &lt;= 9). %1 to %9 provide access to the grouped
352           parts (again, in parentheses) of the pattern, from the last matched
353           <code>RewriteCond</code> in the current set
354           of conditions. %0 provides access to the whole string matched by
355           that pattern.
356         </li>
357         <li>
358           <strong>RewriteMap expansions</strong>: These are
359           expansions of the form <strong><code
360           >${mapname:key|default}</code></strong>.
361           See <a href="#mapfunc">the documentation for
362           RewriteMap</a> for more details.
363         </li>
364         <li>
365           <strong>Server-Variables</strong>: These are variables of
366           the form
367             <strong><code>%{</code> <em>NAME_OF_VARIABLE</em>
368             <code>}</code></strong>
369           where <em>NAME_OF_VARIABLE</em> can be a string taken
370           from the following list:
371
372           <table>
373           <columnspec><column width=".3"/><column width=".3"/>
374            <column width=".3"/></columnspec>
375             <tr>
376               <th>HTTP headers:</th> <th>connection &amp; request:</th> <th></th>
377             </tr>
378
379             <tr>
380               <td>
381                  HTTP_USER_AGENT<br />
382                  HTTP_REFERER<br />
383                  HTTP_COOKIE<br />
384                  HTTP_FORWARDED<br />
385                  HTTP_HOST<br />
386                  HTTP_PROXY_CONNECTION<br />
387                  HTTP_ACCEPT<br />
388               </td>
389
390               <td>
391                  REMOTE_ADDR<br />
392                  REMOTE_HOST<br />
393                  REMOTE_PORT<br />
394                  REMOTE_USER<br />
395                  REMOTE_IDENT<br />
396                  REQUEST_METHOD<br />
397                  SCRIPT_FILENAME<br />
398                  PATH_INFO<br />
399                  QUERY_STRING<br />
400                  AUTH_TYPE<br />
401               </td>
402
403               <td></td>
404             </tr>
405
406             <tr>
407               <th>server internals:</th> <th>date and time:</th> <th>specials:</th>
408             </tr>
409
410             <tr>
411               <td>
412                  DOCUMENT_ROOT<br />
413                  SERVER_ADMIN<br />
414                  SERVER_NAME<br />
415                  SERVER_ADDR<br />
416                  SERVER_PORT<br />
417                  SERVER_PROTOCOL<br />
418                  SERVER_SOFTWARE<br />
419               </td>
420
421               <td>
422                  TIME_YEAR<br />
423                  TIME_MON<br />
424                  TIME_DAY<br />
425                  TIME_HOUR<br />
426                  TIME_MIN<br />
427                  TIME_SEC<br />
428                  TIME_WDAY<br />
429                  TIME<br />
430               </td>
431
432               <td>
433                  API_VERSION<br />
434                  THE_REQUEST<br />
435                  REQUEST_URI<br />
436                  REQUEST_FILENAME<br />
437                  IS_SUBREQ<br />
438                  HTTPS<br />
439               </td>
440             </tr>
441           </table>
442
443                 <p>These variables all
444                 correspond to the similarly named HTTP
445                 MIME-headers, C variables of the Apache HTTP Server or
446                 <code>struct tm</code> fields of the Unix system.
447                 Most are documented elsewhere in the Manual or in
448                 the CGI specification. Those that are special to
449                 mod_rewrite include those below.</p>
450         <note>
451                 <dl>
452                   <dt><code>IS_SUBREQ</code></dt>
453
454                   <dd>Will contain the text "true" if the request
455                   currently being processed is a sub-request,
456                   "false" otherwise. Sub-requests may be generated
457                   by modules that need to resolve additional files
458                   or URIs in order to complete their tasks.</dd>
459
460                   <dt><code>API_VERSION</code></dt>
461
462                   <dd>This is the version of the Apache httpd module API
463                   (the internal interface between server and
464                   module) in the current httpd build, as defined in
465                   include/ap_mmn.h. The module API version
466                   corresponds to the version of Apache httpd in use (in
467                   the release version of Apache httpd 1.3.14, for
468                   instance, it is 19990320:10), but is mainly of
469                   interest to module authors.</dd>
470
471                   <dt><code>THE_REQUEST</code></dt>
472
473                   <dd>The full HTTP request line sent by the
474                   browser to the server (e.g., "<code>GET
475                   /index.html HTTP/1.1</code>"). This does not
476                   include any additional headers sent by the
477                   browser.</dd>
478
479                   <dt><code>REQUEST_URI</code></dt>
480
481                   <dd>The resource requested in the HTTP request
482                   line. (In the example above, this would be
483                   "/index.html".)</dd>
484
485                   <dt><code>REQUEST_FILENAME</code></dt>
486
487                   <dd>The full local filesystem path to the file or
488                   script matching the request, if this has already
489                   been determined by the server at the time 
490                   <code>REQUEST_FILENAME</code> is referenced. Otherwise, 
491                   such as when used in virtual host context, the same 
492                   value as <code>REQUEST_URI</code>.</dd>
493
494                   <dt><code>HTTPS</code></dt>
495
496                   <dd>Will contain the text "on" if the connection is
497                   using SSL/TLS, or "off" otherwise.  (This variable
498                   can be safely used regardless of whether or not
499                   <module>mod_ssl</module> is loaded).</dd>
500
501                 </dl>
502 </note>
503         </li>
504       </ul>
505
506       <p>Other things you should be aware of:</p>
507
508       <ol>
509         <li>
510         <p>The variables SCRIPT_FILENAME and REQUEST_FILENAME
511         contain the same value - the value of the
512         <code>filename</code> field of the internal
513         <code>request_rec</code> structure of the Apache HTTP Server.
514         The first name is the commonly known CGI variable name
515         while the second is the appropriate counterpart of
516         REQUEST_URI (which contains the value of the
517         <code>uri</code> field of <code>request_rec</code>).</p>
518         <p>If a substitution occurred and the rewriting continues,
519         the value of both variables will be updated accordingly.</p>
520         <p>If used in per-server context (<em>i.e.</em>, before the
521         request is mapped to the filesystem) SCRIPT_FILENAME and
522         REQUEST_FILENAME cannot contain the full local filesystem
523         path since the path is unknown at this stage of processing.
524         Both variables will initially contain the value of REQUEST_URI
525         in that case. In order to obtain the full local filesystem
526         path of the request in per-server context, use an URL-based
527         look-ahead <code>%{LA-U:REQUEST_FILENAME}</code> to determine
528         the final value of REQUEST_FILENAME.</p></li>
529
530         <li>
531         <code>%{ENV:variable}</code>, where <em>variable</em> can be
532         any environment variable, is also available.
533         This is looked-up via internal
534         Apache httpd structures and (if not found there) via
535         <code>getenv()</code> from the Apache httpd server process.</li>
536
537         <li>
538         <code>%{SSL:variable}</code>, where <em>variable</em> is the
539         name of an <a href="mod_ssl.html#envvars">SSL environment
540         variable</a>, can be used whether or not
541         <module>mod_ssl</module> is loaded, but will always expand to
542         the empty string if it is not.  Example:
543         <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to
544         <code>128</code>.</li>
545
546         <li>
547         <code>%{HTTP:header}</code>, where <em>header</em> can be
548         any HTTP MIME-header name, can always be used to obtain the
549         value of a header sent in the HTTP request.
550         Example: <code>%{HTTP:Proxy-Connection}</code> is
551         the value of the HTTP header
552         ``<code>Proxy-Connection:</code>''.
553         <p>If a HTTP header is used in a condition this header is added to
554         the Vary header of the response in case the condition evaluates to
555         to true for the request. It is <strong>not</strong> added if the
556         condition evaluates to false for the request. Adding the HTTP header
557         to the Vary header of the response is needed for proper caching.</p>
558         <p>It has to be kept in mind that conditions follow a short circuit
559         logic in the case of the '<strong><code>ornext|OR</code></strong>' flag
560         so that certain conditions might not be evaluated at all.</p></li>
561
562         <li>
563         <code>%{LA-U:variable}</code> can be used for look-aheads which perform
564         an internal (URL-based) sub-request to determine the final
565         value of <em>variable</em>. This can be used to access
566         variable for rewriting which is not available at the current
567         stage, but will be set in a later phase.
568         <p>For instance, to rewrite according to the
569         <code>REMOTE_USER</code> variable from within the
570         per-server context (<code>httpd.conf</code> file) you must
571         use <code>%{LA-U:REMOTE_USER}</code> - this
572         variable is set by the authorization phases, which come
573         <em>after</em> the URL translation phase (during which mod_rewrite
574         operates).</p>
575         <p>On the other hand, because mod_rewrite implements
576         its per-directory context (<code>.htaccess</code> file) via
577         the Fixup phase of the API and because the authorization
578         phases come <em>before</em> this phase, you just can use
579         <code>%{REMOTE_USER}</code> in that context.</p></li>
580
581         <li>
582         <code>%{LA-F:variable}</code> can be used to perform an internal
583         (filename-based) sub-request, to determine the final value
584         of <em>variable</em>. Most of the time, this is the same as
585         LA-U above.</li>
586       </ol>
587
588       <p><em>CondPattern</em> is the condition pattern,
589        a regular expression which is applied to the
590       current instance of the <em>TestString</em>.
591       <em>TestString</em> is first evaluated, before being matched against
592       <em>CondPattern</em>.</p>
593
594       <p><em>CondPattern</em> is usually a
595       <em>perl compatible regular expression</em>, but there is
596       additional syntax available to perform other useful tests against
597       the <em>Teststring</em>:</p>
598
599       <ol>
600         <li>You can prefix the pattern string with a
601         '<code>!</code>' character (exclamation mark) to specify a
602         <strong>non</strong>-matching pattern.</li>
603
604         <li>
605           You can perform lexicographical string comparisons:
606
607           <ul>
608             <li>'<strong>&lt;CondPattern</strong>' (lexicographically
609             precedes)<br />
610             Treats the <em>CondPattern</em> as a plain string and
611             compares it lexicographically to <em>TestString</em>. True if
612             <em>TestString</em> lexicographically precedes
613             <em>CondPattern</em>.</li>
614
615             <li>'<strong>&gt;CondPattern</strong>' (lexicographically
616             follows)<br />
617             Treats the <em>CondPattern</em> as a plain string and
618             compares it lexicographically to <em>TestString</em>. True if
619             <em>TestString</em> lexicographically follows
620             <em>CondPattern</em>.</li>
621
622             <li>'<strong>=CondPattern</strong>' (lexicographically
623             equal)<br />
624             Treats the <em>CondPattern</em> as a plain string and
625             compares it lexicographically to <em>TestString</em>. True if
626             <em>TestString</em> is lexicographically equal to
627             <em>CondPattern</em> (the two strings are exactly
628             equal, character for character). If <em>CondPattern</em>
629             is <code>""</code> (two quotation marks) this
630             compares <em>TestString</em> to the empty string.</li>
631
632             <li>'<strong>&lt;=CondPattern</strong>' (lexicographically
633             less than or equal to)<br />
634             Treats the <em>CondPattern</em> as a plain string and
635             compares it lexicographically to <em>TestString</em>. True
636             if <em>TestString</em> lexicographically precedes
637             <em>CondPattern</em>, or is equal to <em>CondPattern</em>
638             (the two strings are equal, character for character).</li>
639
640             <li>'<strong>&gt;=CondPattern</strong>' (lexicographically
641             greater than or equal to)<br />
642             Treats the <em>CondPattern</em> as a plain string and
643             compares it lexicographically to <em>TestString</em>. True
644             if <em>TestString</em> lexicographically follows
645             <em>CondPattern</em>, or is equal to <em>CondPattern</em>
646             (the two strings are equal, character for character).</li>
647         </ul></li>
648
649         <li>
650           You can perform integer comparisons:
651           <ul>
652
653             <li>'<strong>-eq</strong>' (is numerically
654             <strong>eq</strong>ual to)<br />
655             The <em>TestString</em> is treated as an integer, and is
656             numerically compared to the <em>CondPattern</em>. True if
657             the two are numerically equal.</li>
658
659             <li>'<strong>-ge</strong>' (is numerically
660             <strong>g</strong>reater than or <strong>e</strong>qual to)<br />
661             The <em>TestString</em> is treated as an integer, and is
662             numerically compared to the <em>CondPattern</em>. True if
663             the <em>TestString</em> is numerically greater than or equal
664             to the <em>CondPattern</em>.</li>
665             
666              <li>'<strong>-gt</strong>' (is numerically
667             <strong>g</strong>reater <strong>t</strong>han)<br />
668             The <em>TestString</em> is treated as an integer, and is
669             numerically compared to the <em>CondPattern</em>. True if
670             the <em>TestString</em> is numerically greater than
671             the <em>CondPattern</em>.</li>
672
673             <li>'<strong>-le</strong>' (is numerically
674             <strong>l</strong>ess than or <strong>e</strong>qual to)<br />
675             The <em>TestString</em> is treated as an integer, and is
676             numerically compared to the <em>CondPattern</em>. True if
677             the <em>TestString</em> is numerically less than or equal
678             to the <em>CondPattern</em>. Avoid confusion with the
679             <strong>-l</strong> by using the <strong>-L</strong> or
680             <strong>-h</strong> variant.</li>
681             
682              <li>'<strong>-lt</strong>' (is numerically
683             <strong>l</strong>ess <strong>t</strong>han)<br />
684             The <em>TestString</em> is treated as an integer, and is
685             numerically compared to the <em>CondPattern</em>. True if
686             the <em>TestString</em> is numerically less than
687             the <em>CondPattern</em>. Avoid confusion with the
688             <strong>-l</strong> by using the <strong>-L</strong> or
689             <strong>-h</strong> variant.</li>
690
691            </ul>
692         </li>
693
694         <li>You can perform various file attribute tests:
695           <ul>
696             <li>'<strong>-d</strong>' (is
697             <strong>d</strong>irectory)<br />
698              Treats the <em>TestString</em> as a pathname and tests
699             whether or not it exists, and is a directory.</li>
700
701             <li>'<strong>-f</strong>' (is regular
702             <strong>f</strong>ile)<br />
703              Treats the <em>TestString</em> as a pathname and tests
704             whether or not it exists, and is a regular file.</li>
705
706             <li>'<strong>-F</strong>' (is existing file, via
707             subrequest)<br />
708             Checks whether or not <em>TestString</em> is a valid file,
709             accessible via all the server's currently-configured
710             access controls for that path. This uses an internal
711             subrequest to do the check, so use it with care -
712             it can impact your server's performance!</li>
713
714             <li>'<strong>-H</strong>' (is symbolic link, bash convention)<br />
715             See <strong>-l</strong>.</li>
716
717             <li>'<strong>-l</strong>' (is symbolic
718             <strong>l</strong>ink)<br />
719             Treats the <em>TestString</em> as a pathname and tests
720             whether or not it exists, and is a symbolic link. May also
721             use the bash convention of <strong>-L</strong> or
722             <strong>-h</strong> if there's a possibility of confusion
723             such as when using the <strong>-lt</strong> or
724             <strong>-le</strong> tests.</li>
725
726             <li>'<strong>-L</strong>' (is symbolic link, bash convention)<br />
727             See <strong>-l</strong>.</li>
728
729             <li>'<strong>-s</strong>' (is regular file, with
730             <strong>s</strong>ize)<br />
731             Treats the <em>TestString</em> as a pathname and tests
732             whether or not it exists, and is a regular file with size greater
733             than zero.</li>
734
735             <li>'<strong>-U</strong>' (is existing URL, via
736             subrequest)<br />
737             Checks whether or not <em>TestString</em> is a valid URL,
738             accessible via all the server's currently-configured
739             access controls for that path. This uses an internal
740             subrequest to do the check, so use it with care -
741             it can impact your server's performance!</li>
742
743             <li>'<strong>-x</strong>' (has e<strong>x</strong>ecutable
744             permissions)<br />
745             Treats the <em>TestString</em> as a pathname and tests
746             whether or not it exists, and has executable permissions.
747             These permissions are determined according to
748             the underlying OS.</li>
749
750           </ul>
751
752 <note><title>Note:</title>
753               All of these tests can
754               also be prefixed by an exclamation mark ('!') to
755               negate their meaning.
756 </note>
757         </li>
758
759         <li>You can also set special flags for
760       <em>CondPattern</em> by appending
761         <strong><code>[</code><em>flags</em><code>]</code></strong>
762       as the third argument to the <code>RewriteCond</code>
763       directive, where <em>flags</em> is a comma-separated list of any of the
764       following flags:
765
766       <ul>
767         <li>'<strong><code>nocase|NC</code></strong>'
768         (<strong>n</strong>o <strong>c</strong>ase)<br />
769         This makes the test case-insensitive - differences
770         between 'A-Z' and 'a-z' are ignored, both in the
771         expanded <em>TestString</em> and the <em>CondPattern</em>.
772         This flag is effective only for comparisons between
773         <em>TestString</em> and <em>CondPattern</em>. It has no
774         effect on filesystem and subrequest checks.</li>
775
776         <li>
777           '<strong><code>ornext|OR</code></strong>'
778           (<strong>or</strong> next condition)<br />
779           Use this to combine rule conditions with a local OR
780           instead of the implicit AND. Typical example:
781
782 <example>
783 <pre>
784 RewriteCond %{REMOTE_HOST}  ^host1  [OR]
785 RewriteCond %{REMOTE_HOST}  ^host2  [OR]
786 RewriteCond %{REMOTE_HOST}  ^host3
787 RewriteRule ...some special stuff for any of these hosts...
788 </pre>
789 </example>
790
791           Without this flag you would have to write the condition/rule
792           pair three times.
793         </li>
794
795         <li>'<strong><code>novary|NV</code></strong>'
796         (<strong>n</strong>o <strong>v</strong>ary)<br />
797         If a HTTP header is used in the condition, this flag prevents
798         this header from being added to the Vary header of the response. <br />
799         Using this flag might break proper caching of the response if
800         the representation of this response varies on the value of this header.
801         So this flag should be only used if the meaning of the Vary header
802         is well understood.
803         </li>
804       </ul>
805       </li>
806      </ol>
807
808       <p><strong>Example:</strong></p>
809
810        <p>To rewrite the Homepage of a site according to the
811         ``<code>User-Agent:</code>'' header of the request, you can
812         use the following: </p>
813
814 <example>
815 <pre>
816 RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla
817 RewriteRule  ^/$                 /homepage.max.html  [L]
818
819 RewriteCond  %{HTTP_USER_AGENT}  ^Lynx
820 RewriteRule  ^/$                 /homepage.min.html  [L]
821
822 RewriteRule  ^/$                 /homepage.std.html  [L]
823 </pre>
824 </example>
825
826         <p>Explanation: If you use a browser which identifies itself
827         as 'Mozilla' (including Netscape Navigator, Mozilla etc), then you
828         get the max homepage (which could include frames, or other special
829         features).
830         If you use the Lynx browser (which is terminal-based), then
831         you get the min homepage (which could be a version designed for
832         easy, text-only browsing).
833         If neither of these conditions apply (you use any other browser,
834         or your browser identifies itself as something non-standard), you get
835         the std (standard) homepage.</p>
836
837 </usage>
838
839 </directivesynopsis>
840
841 <directivesynopsis>
842 <name>RewriteRule</name>
843 <description>Defines rules for the rewriting engine</description>
844 <syntax>RewriteRule
845       <em>Pattern</em> <em>Substitution</em> [<em>flags</em>]</syntax>
846 <contextlist><context>server config</context><context>virtual host</context>
847 <context>directory</context><context>.htaccess</context></contextlist>
848 <override>FileInfo</override>
849
850 <usage>
851       <p>The <directive>RewriteRule</directive> directive is the real
852       rewriting workhorse. The directive can occur more than once,
853       with each instance defining a single rewrite rule. The
854       order in which these rules are defined is important - this is the order
855       in which they will be applied at run-time.</p>
856
857       <p><a id="patterns" name="patterns"><em>Pattern</em></a> is
858       a perl compatible <a id="regexp" name="regexp">regular
859       expression</a>. On the first RewriteRule it is applied to the (%-encoded)
860       <a href="./directive-dict.html#Syntax">URL-path</a> of the request;
861       subsequent patterns are applied to the output of the last matched
862       RewriteRule.</p>
863
864 <note><title>What is matched?</title>
865       <p>The <em>Pattern</em> will initially be matched against the part of the
866       URL after the hostname and port, and before the query string.</p>
867
868       <p>When the RewriteRule appears in per-directory (htaccess) context, the 
869       <em>Pattern</em> is matched against what remains of the URL after removing
870       the prefix that lead Apache httpd to the current rules (see the 
871       <directive module="mod_rewrite">RewriteBase</directive>).  The removed prefix
872       always ends with a slash, meaning the matching occurs against a string which
873       never has a leading slash.  A <em>Pattern</em> with <code>^/</code> never
874       matches in per-directory context.</p>
875
876       <p>If you wish to match against the hostname, port, or query string, use a
877       <directive module="mod_rewrite">RewriteCond</directive> with the
878       <code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, or
879       <code>%{QUERY_STRING}</code> variables respectively. If you wish to 
880       match against the full URL-path in a per-directory (htaccess) RewriteRule, 
881       use the <code>%{REQUEST_URI}</code> variable.</p>
882
883 </note>
884
885       <p>For some hints on <glossary ref="regex">regular
886       expressions</glossary>, see
887       the <a href="../rewrite/intro.html#regex">mod_rewrite
888       Introduction</a>.</p>
889
890       <p>In mod_rewrite, the NOT character
891       ('<code>!</code>') is also available as a possible pattern
892       prefix. This enables you to negate a pattern; to say, for instance:
893       ``<em>if the current URL does <strong>NOT</strong> match this
894       pattern</em>''. This can be used for exceptional cases, where
895       it is easier to match the negative pattern, or as a last
896       default rule.</p>
897
898 <note><title>Note</title>
899 When using the NOT character to negate a pattern, you cannot include
900 grouped wildcard parts in that pattern. This is because, when the
901 pattern does NOT match (ie, the negation matches), there are no
902 contents for the groups. Thus, if negated patterns are used, you
903 cannot use <code>$N</code> in the substitution string!
904 </note>
905
906       <p>The <a id="rhs" name="rhs"><em>Substitution</em></a> of a
907       rewrite rule is the string that replaces the original URL-path that
908       was matched by <em>Pattern</em>.  The <em>Substitution</em> may
909       be a:</p>
910
911       <dl>
912
913         <dt>file-system path</dt>
914
915         <dd>Designates the location on the file-system of the resource
916         to be delivered to the client.</dd>
917
918         <dt>URL-path</dt>
919
920         <dd>A <directive
921         module="core">DocumentRoot</directive>-relative path to the
922         resource to be served. Note that <module>mod_rewrite</module>
923         tries to guess whether you have specified a file-system path
924         or a URL-path by checking to see if the first segment of the
925         path exists at the root of the file-system. For example, if
926         you specify a <em>Substitution</em> string of
927         <code>/www/file.html</code>, then this will be treated as a
928         URL-path <em>unless</em> a directory named <code>www</code>
929         exists at the root or your file-system, in which case it will
930         be treated as a file-system path. If you wish other
931         URL-mapping directives (such as <directive
932         module="mod_alias">Alias</directive>) to be applied to the
933         resulting URL-path, use the <code>[PT]</code> flag as
934         described below.</dd>
935
936         <dt>Absolute URL</dt>
937
938         <dd>If an absolute URL is specified,
939         <module>mod_rewrite</module> checks to see whether the
940         hostname matches the current host. If it does, the scheme and
941         hostname are stripped out and the resulting path is treated as
942         a URL-path. Otherwise, an external redirect is performed for
943         the given URL. To force an external redirect back to the
944         current host, see the <code>[R]</code> flag below.</dd>
945
946         <dt><code>-</code> (dash)</dt>
947
948         <dd>A dash indicates that no substitution should be performed
949         (the existing path is passed through untouched). This is used
950         when a flag (see below) needs to be applied without changing
951         the path.</dd>
952
953       </dl>
954
955       <p>In addition to plain text, the <em>Substition</em> string can include</p>
956
957       <ol>
958         <li>back-references (<code>$N</code>) to the RewriteRule
959         pattern</li>
960
961         <li>back-references (<code>%N</code>) to the last matched
962         RewriteCond pattern</li>
963
964         <li>server-variables as in rule condition test-strings
965         (<code>%{VARNAME}</code>)</li>
966
967         <li><a href="#mapfunc">mapping-function</a> calls
968         (<code>${mapname:key|default}</code>)</li>
969       </ol>
970
971       <p>Back-references are identifiers of the form
972       <code>$</code><strong>N</strong>
973       (<strong>N</strong>=0..9), which will be replaced
974       by the contents of the <strong>N</strong>th group of the
975       matched <em>Pattern</em>. The server-variables are the same
976       as for the <em>TestString</em> of a <code>RewriteCond</code>
977       directive. The mapping-functions come from the
978       <code>RewriteMap</code> directive and are explained there.
979       These three types of variables are expanded in the order above.</p>
980
981       <p>As already mentioned, all rewrite rules are
982       applied to the <em>Substitution</em> (in the order in which
983       they are defined
984       in the config file). The URL is <strong>completely
985       replaced</strong> by the <em>Substitution</em> and the
986       rewriting process continues until all rules have been applied,
987       or it is explicitly terminated by a
988       <code><strong>L</strong></code> flag.</p>
989
990      <note><title>Modifying the Query String</title>
991       <p>By default, the query string is passed through unchanged. You
992       can, however, create URLs in the substitution string containing
993       a query string part. Simply use a question mark inside the
994       substitution string to indicate that the following text should
995       be re-injected into the query string. When you want to erase an
996       existing query string, end the substitution string with just a
997       question mark. To combine new and old query strings, use the
998       <code>[QSA]</code> flag.</p>
999      </note>
1000
1001       <p>Additionally you can set special <a name="rewriteflags"
1002       id="rewriteflags">actions</a> to be performed by
1003       appending <strong><code>[</code><em>flags</em><code>]</code></strong>
1004       as the third argument to the <code>RewriteRule</code>
1005       directive. <em>Flags</em> is a comma-separated list, surround by square
1006       brackets, of any of the flags in the following table. More
1007       details, and examples, for each flag, are available in the <a
1008       href="../rewrite/flags.html">Rewrite Flags document</a>.</p>
1009
1010     <table border="1">
1011     <tr><th>Flag and syntax</th>
1012         <th>Function</th>
1013     </tr>
1014     <tr>
1015         <td>B</td>
1016         <td>Escape non-alphanumeric characters <em>before</em> applying
1017         the transformation. <em><a
1018         href="../rewrite/flags.html#flag_b">details ...</a></em></td>
1019     </tr>
1020     <tr>
1021         <td>chain|C</td>
1022         <td>Rule is chained to the following rule. If the rule fails,
1023         the rule(s) chained to it will be skipped. <em><a
1024         href="../rewrite/flags.html#flag_c">details ...</a></em></td>
1025     </tr>
1026     <tr>
1027         <td>cookie|CO=<em>NAME</em>:<em>VAL</em></td>
1028         <td>Sets a cookie in the client browser. Full syntax is: 
1029         CO=<em>NAME</em>:<em>VAL</em>[:<em>domain</em>[:<em>lifetime</em>[:<em>path</em>[:<em>secure</em>[:<em>httponly</em>]]]]] <em><a href="../rewrite/flags.html#flag_co">details ...</a></em>
1030         </td>
1031     </tr>
1032     <tr>
1033         <td>discardpathinfo|DPI</td>
1034         <td>Causes the PATH_INFO portion of the rewritten URI to be
1035         discarded. <em><a href="../rewrite/flags.html#flag_dpi">details 
1036         ...</a></em></td>
1037     </tr>
1038     <tr>
1039         <td>env|E=<em>VAR</em>[:<em>VAL</em>]</td>
1040         <td>Causes an environment variable <em>VAR</em> to be set (to the
1041         value <em>VAL</em> if provided). <em><a
1042         href="../rewrite/flags.html#flag_e">details ...</a></em></td>
1043     </tr>
1044     <tr>
1045         <td>forbidden|F</td>
1046         <td>Returns a 403 FORBIDDEN response to the client browser.
1047         <em><a href="../rewrite/flags.html#flag_f">details ...</a></em></td>
1048     </tr>
1049     <tr>
1050         <td>gone|G</td>
1051         <td>Returns a 410 GONE response to the client browser. <em><a
1052         href="../rewrite/flags.html#flag_g">details ...</a></em></td>
1053     </tr>
1054     <tr>
1055         <td>Handler|H=<em>Content-handler</em></td>
1056         <td>Causes the resulting URI to be sent to the specified
1057         <em>Content-handler</em> for processing. <em><a
1058         href="../rewrite/flags.html#flag_h">details ...</a></em></td>
1059     </tr>
1060     <tr>
1061         <td>last|L</td>
1062         <td>Stop the rewriting process immediately and don't apply any
1063         more rules. Especially note caveats for per-directory and
1064         .htaccess context (see also the END flag). <em><a
1065         href="../rewrite/flags.html#flag_l">details ...</a></em></td>
1066     </tr>
1067     <tr>
1068         <td>next|N</td>
1069         <td>Re-run the rewriting process, starting again with the first
1070         rule, using the result of the ruleset so far as a starting
1071         point. <em><a href="../rewrite/flags.html#flag_n">details
1072         ...</a></em></td>
1073     </tr>
1074     <tr>
1075         <td>nocase|NC</td>
1076         <td>Makes the pattern pattern comparison case-insensitive.
1077         <em><a href="../rewrite/flags.html#flag_nc">details ...</a></em></td>
1078     </tr>
1079     <tr>
1080         <td>noescape|NE</td>
1081         <td>Prevent mod_rewrite from applying hexcode escaping of
1082         special characters in the result of the rewrite. <em><a
1083         href="../rewrite/flags.html#flag_ne">details ...</a></em></td>
1084     </tr>
1085     <tr>
1086         <td>nosubreq|NS</td>
1087         <td>Causes a rule to be skipped if the current request is an
1088         internal sub-request. <em><a
1089         href="../rewrite/flags.html#flag_ns">details ...</a></em></td>
1090     </tr>
1091     <tr>
1092         <td>proxy|P</td>
1093         <td>Force the substitution URL to be internally sent as a proxy
1094         request. <em><a href="../rewrite/flags.html#flag_p">details
1095         ...</a></em></td>
1096     </tr>
1097     <tr>
1098         <td>passthrough|PT</td>
1099         <td>Forces the resulting URI to be passed back to the URL
1100         mapping engine for processing of other URI-to-filename
1101         translators, such as <code>Alias</code> or
1102         <code>Redirect</code>. <em><a
1103         href="../rewrite/flags.html#flag_pt">details ...</a></em></td>
1104     </tr>
1105     <tr>
1106         <td>qsappend|QSA</td>
1107         <td>Appends any query string created in the rewrite target to
1108         any query string that was in the original request URL. <em><a
1109         href="../rewrite/flags.html#flag_qsa">details ...</a></em></td>
1110     </tr>
1111     <tr>
1112         <td>qsdiscard|QSD</td>
1113         <td>Discard any query string attached to the incoming URI.
1114         <em><a href="../rewrite/flags.html#flag_qsd">details
1115         ...</a></em></td>
1116     </tr>
1117     <tr>
1118         <td>redirect|R[=<em>code</em>]</td>
1119         <td>Forces an external redirect, optionally with the specified
1120         HTTP status code. <em><a
1121         href="../rewrite/flags.html#flag_r">details ...</a></em>
1122         </td>
1123     </tr>
1124     <tr>
1125         <td>END</td>
1126         <td>Stop the rewriting process immediately and don't apply any
1127         more rules. Also prevents further execution of rewrite rules
1128         in per-directory and .htaccess context. (Available in 2.3.9 and later)
1129         <em><a href="../rewrite/flags.html#flag_l">details ...</a></em></td>
1130     </tr>
1131     <tr>
1132         <td>skip|S=<em>num</em></td>
1133         <td>Tells the rewriting engine to skip the next <em>num</em>
1134         rules if the current rule matches. <em><a
1135         href="../rewrite/flags.html#flag_s">details ...</a></em></td>
1136     </tr>
1137     <tr>
1138         <td>tyle|T=<em>MIME-type</em></td>
1139         <td>Force the <glossary>MIME-type</glossary> of the target file
1140         to be the specified type. <em><a
1141         href="../rewrite/flags.html#flag_t">details ...</a></em></td>
1142     </tr>
1143     </table>
1144
1145 <note><title>Home directory expansion</title>
1146 <p> When the substitution string begins with a string
1147 resembling "/~user" (via explicit text or backreferences), mod_rewrite performs
1148 home directory expansion independent of the presence or configuration
1149 of <module>mod_userdir</module>.</p>
1150
1151 <p> This expansion does not occur when the <em>PT</em>
1152 flag is used on the <directive module="mod_rewrite">RewriteRule</directive>
1153 directive.</p>
1154 </note>
1155
1156 <note><title>Per-directory Rewrites</title>
1157
1158 <p>The rewrite engine may be used in <a
1159 href="../howto/htaccess.html">.htaccess</a> files.  To enable the
1160 rewrite engine for these files you need to set
1161 "<code>RewriteEngine On</code>" <strong>and</strong>
1162 "<code>Options FollowSymLinks</code>" must be enabled. If your
1163 administrator has disabled override of <code>FollowSymLinks</code> for
1164 a user's directory, then you cannot use the rewrite engine. This
1165 restriction is required for security reasons.</p>
1166
1167 <p>When using the rewrite engine in <code>.htaccess</code> files the
1168 per-directory prefix (which always is the same for a specific
1169 directory) is automatically <em>removed</em> for the pattern matching
1170 and automatically <em>added</em> after the substitution has been
1171 done. This feature is essential for many sorts of rewriting; without
1172 this, you would always have to match the parent directory, which is
1173 not always possible.  There is one exception: If a substitution string
1174 starts with <code>http://</code>, then the directory prefix will
1175 <strong>not</strong> be added, and an external redirect (or proxy
1176 throughput, if using flag <strong>P</strong>) is forced.  See the
1177 <directive module="mod_rewrite">RewriteBase</directive> directive for
1178 more information.</p>
1179
1180 <p>The rewrite engine may also be used in <directive type="section"
1181 module="core">Directory</directive> sections with the same
1182 prefix-matching rules as would be applied to <code>.htaccess</code>
1183 files.  It is usually simpler, however, to avoid the prefix substitution
1184 complication by putting the rewrite rules in the main server or
1185 virtual host context, rather than in a <directive type="section"
1186 module="core">Directory</directive> section.</p>
1187
1188 <p>Although rewrite rules are syntactically permitted in <directive
1189 type="section" module="core">Location</directive> and <directive
1190 type="section" module="core">Files</directive> sections, this
1191 should never be necessary and is unsupported.</p>
1192
1193 </note>
1194
1195      <p>Here are all possible substitution combinations and their
1196       meanings:</p>
1197
1198       <p><strong>Inside per-server configuration
1199       (<code>httpd.conf</code>)<br />
1200        for request ``<code>GET
1201       /somepath/pathinfo</code>'':</strong><br />
1202       </p>
1203
1204 <table border="1">
1205 <tr>
1206 <th>Given Rule</th>
1207 <th>Resulting Substitution</th>
1208 </tr>
1209
1210 <tr>
1211 <td>^/somepath(.*) otherpath$1</td>
1212 <td>invalid, not supported</td>
1213 </tr>
1214
1215 <tr>
1216 <td>^/somepath(.*) otherpath$1  [R]</td>
1217 <td>invalid, not supported</td>
1218 </tr>
1219
1220 <tr>
1221 <td>^/somepath(.*) otherpath$1  [P]</td>
1222 <td>invalid, not supported</td>
1223 </tr>
1224
1225 <tr>
1226 <td>^/somepath(.*) /otherpath$1</td>
1227 <td>/otherpath/pathinfo</td>
1228 </tr>
1229
1230 <tr>
1231 <td>^/somepath(.*) /otherpath$1 [R]</td>
1232 <td>http://thishost/otherpath/pathinfo via external redirection</td>
1233 </tr>
1234
1235 <tr>
1236 <td>^/somepath(.*) /otherpath$1 [P]</td>
1237 <td>doesn't make sense, not supported</td>
1238 </tr>
1239
1240 <tr>
1241 <td>^/somepath(.*) http://thishost/otherpath$1</td>
1242 <td>/otherpath/pathinfo</td>
1243 </tr>
1244
1245 <tr>
1246 <td>^/somepath(.*) http://thishost/otherpath$1 [R]</td>
1247 <td>http://thishost/otherpath/pathinfo via external redirection</td>
1248 </tr>
1249
1250 <tr>
1251 <td>^/somepath(.*) http://thishost/otherpath$1 [P]</td>
1252 <td>doesn't make sense, not supported</td>
1253 </tr>
1254
1255 <tr>
1256 <td>^/somepath(.*) http://otherhost/otherpath$1</td>
1257 <td>http://otherhost/otherpath/pathinfo via external redirection</td>
1258 </tr>
1259
1260 <tr>
1261 <td>^/somepath(.*) http://otherhost/otherpath$1 [R]</td>
1262 <td>http://otherhost/otherpath/pathinfo via external redirection (the [R] flag is redundant)</td>
1263 </tr>
1264
1265 <tr>
1266 <td>^/somepath(.*) http://otherhost/otherpath$1 [P]</td>
1267 <td>http://otherhost/otherpath/pathinfo via internal proxy</td>
1268 </tr>
1269 </table>
1270
1271       <p><strong>Inside per-directory configuration for
1272       <code>/somepath</code><br />
1273        (<code>/physical/path/to/somepath/.htacccess</code>, with
1274       <code>RewriteBase /somepath</code>)<br />
1275        for request ``<code>GET
1276       /somepath/localpath/pathinfo</code>'':</strong><br />
1277      </p>
1278
1279 <table border="1">
1280
1281 <tr>
1282 <th>Given Rule</th>
1283 <th>Resulting Substitution</th>
1284 </tr>
1285
1286 <tr>
1287 <td>^localpath(.*) otherpath$1</td>
1288 <td>/somepath/otherpath/pathinfo</td>
1289 </tr>
1290
1291 <tr>
1292 <td>^localpath(.*) otherpath$1  [R]</td>
1293 <td>http://thishost/somepath/otherpath/pathinfo via external
1294 redirection</td>
1295 </tr>
1296
1297 <tr>
1298 <td>^localpath(.*) otherpath$1  [P]</td>
1299 <td>doesn't make sense, not supported</td>
1300 </tr>
1301
1302 <tr>
1303 <td>^localpath(.*) /otherpath$1</td>
1304 <td>/otherpath/pathinfo</td>
1305 </tr>
1306
1307 <tr>
1308 <td>^localpath(.*) /otherpath$1 [R]</td>
1309 <td>http://thishost/otherpath/pathinfo via external redirection</td>
1310 </tr>
1311
1312 <tr>
1313 <td>^localpath(.*) /otherpath$1 [P]</td>
1314 <td>doesn't make sense, not supported</td>
1315 </tr>
1316
1317 <tr>
1318 <td>^localpath(.*) http://thishost/otherpath$1</td>
1319 <td>/otherpath/pathinfo</td>
1320 </tr>
1321
1322 <tr>
1323 <td>^localpath(.*) http://thishost/otherpath$1 [R]</td>
1324 <td>http://thishost/otherpath/pathinfo via external redirection</td>
1325 </tr>
1326
1327 <tr>
1328 <td>^localpath(.*) http://thishost/otherpath$1 [P]</td>
1329 <td>doesn't make sense, not supported</td>
1330 </tr>
1331
1332 <tr>
1333 <td>^localpath(.*) http://otherhost/otherpath$1</td>
1334 <td>http://otherhost/otherpath/pathinfo via external redirection</td>
1335 </tr>
1336
1337 <tr>
1338 <td>^localpath(.*) http://otherhost/otherpath$1 [R]</td>
1339 <td>http://otherhost/otherpath/pathinfo via external redirection (the [R] flag is redundant)</td>
1340 </tr>
1341
1342 <tr>
1343 <td>^localpath(.*) http://otherhost/otherpath$1 [P]</td>
1344 <td>http://otherhost/otherpath/pathinfo via internal proxy</td>
1345 </tr>
1346
1347 </table>
1348
1349   </usage>
1350  </directivesynopsis>
1351 </modulesynopsis>