]> granicus.if.org Git - apache/blob - docs/manual/mod/mod_rewrite.xml
point to where SERVER_NAME and SERVER_PORT get their
[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>before</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       that result in the substitution of a relative path.
284       When you use a <directive module="mod_rewrite">RewriteRule</directive>
285       in a <code>.htaccess</code> file, <module>mod_rewrite</module> strips off
286       the local directory prefix before processing, then rewrites the rest of 
287       the URL. When the rewrite is completed, <module>mod_rewrite</module>
288       automatically adds the local directory prefix (or the
289       <directive>RewriteBase</directive> when set) back on to the substitution 
290       before handing it back to the core of the server as if it were the original
291       URL.</p>
292       
293       <p>This directive is <em>required</em> for per-directory rewrites whose context
294       is a directory made available via the <directive module="mod_alias">Alias</directive>
295       directive, when the substitution uses a relative path.</p>
296
297       <p>If your URL path does not exist verbatim on the filesystem,
298       or isn't directly under your <directive module="core">DocumentRoot</directive>,
299       you must use <directive>RewriteBase</directive> in every
300       <code>.htaccess</code> file where you want to use <directive
301       module="mod_rewrite">RewriteRule</directive> directives.</p>
302
303       <p>The example below demonstrates how to map 
304       http://example.com/myapp/index.html to 
305       /home/www/example/newsite.html, in a <code>.htaccess</code> file. This 
306       assumes that the content available at
307       http://example.com/ is on disk at /home/www/example/</p>
308 <example>
309 <pre>
310 RewriteEngine On
311 # The URL-path used to get to this context, not the filesystem path
312 RewriteBase /myapp/
313 RewriteRule ^index\.html$  newsite.html
314 </pre>
315 </example>
316
317 </usage>
318
319 </directivesynopsis>
320
321 <directivesynopsis>
322 <name>RewriteCond</name>
323 <description>Defines a condition under which rewriting will take place
324 </description>
325 <syntax> RewriteCond
326       <em>TestString</em> <em>CondPattern</em></syntax>
327 <contextlist><context>server config</context><context>virtual host</context>
328 <context>directory</context><context>.htaccess</context></contextlist>
329 <override>FileInfo</override>
330
331 <usage>
332       <p>The <directive>RewriteCond</directive> directive defines a
333       rule condition. One or more <directive>RewriteCond</directive>
334       can precede a <directive module="mod_rewrite">RewriteRule</directive>
335       directive. The following rule is then only used if both
336       the current state of the URI matches its pattern, <strong
337       >and</strong> if these conditions are met.</p>
338
339       <p><em>TestString</em> is a string which can contain the
340       following expanded constructs in addition to plain text:</p>
341
342       <ul>
343         <li>
344           <strong>RewriteRule backreferences</strong>: These are
345           backreferences of the form <strong><code>$N</code></strong>
346           (0 &lt;= N &lt;= 9). $1 to $9 provide access to the grouped
347           parts (in parentheses) of the pattern, from the
348           <code>RewriteRule</code> which is subject to the current
349           set of <code>RewriteCond</code> conditions. $0 provides
350           access to the whole string matched by that pattern.
351         </li>
352         <li>
353           <strong>RewriteCond backreferences</strong>: These are
354           backreferences of the form <strong><code>%N</code></strong>
355           (0 &lt;= N &lt;= 9). %1 to %9 provide access to the grouped
356           parts (again, in parentheses) of the pattern, from the last matched
357           <code>RewriteCond</code> in the current set
358           of conditions. %0 provides access to the whole string matched by
359           that pattern.
360         </li>
361         <li>
362           <strong>RewriteMap expansions</strong>: These are
363           expansions of the form <strong><code
364           >${mapname:key|default}</code></strong>.
365           See <a href="#mapfunc">the documentation for
366           RewriteMap</a> for more details.
367         </li>
368         <li>
369           <strong>Server-Variables</strong>: These are variables of
370           the form
371             <strong><code>%{</code> <em>NAME_OF_VARIABLE</em>
372             <code>}</code></strong>
373           where <em>NAME_OF_VARIABLE</em> can be a string taken
374           from the following list:
375
376           <table>
377           <columnspec><column width=".3"/><column width=".3"/>
378            <column width=".3"/></columnspec>
379             <tr>
380               <th>HTTP headers:</th> <th>connection &amp; request:</th> <th></th>
381             </tr>
382
383             <tr>
384               <td>
385                  HTTP_USER_AGENT<br />
386                  HTTP_REFERER<br />
387                  HTTP_COOKIE<br />
388                  HTTP_FORWARDED<br />
389                  HTTP_HOST<br />
390                  HTTP_PROXY_CONNECTION<br />
391                  HTTP_ACCEPT<br />
392               </td>
393
394               <td>
395                  REMOTE_ADDR<br />
396                  REMOTE_HOST<br />
397                  REMOTE_PORT<br />
398                  REMOTE_USER<br />
399                  REMOTE_IDENT<br />
400                  REQUEST_METHOD<br />
401                  SCRIPT_FILENAME<br />
402                  PATH_INFO<br />
403                  QUERY_STRING<br />
404                  AUTH_TYPE<br />
405               </td>
406
407               <td></td>
408             </tr>
409
410             <tr>
411               <th>server internals:</th> <th>date and time:</th> <th>specials:</th>
412             </tr>
413
414             <tr>
415               <td>
416                  DOCUMENT_ROOT<br />
417                  SERVER_ADMIN<br />
418                  SERVER_NAME<br />
419                  SERVER_ADDR<br />
420                  SERVER_PORT<br />
421                  SERVER_PROTOCOL<br />
422                  SERVER_SOFTWARE<br />
423               </td>
424
425               <td>
426                  TIME_YEAR<br />
427                  TIME_MON<br />
428                  TIME_DAY<br />
429                  TIME_HOUR<br />
430                  TIME_MIN<br />
431                  TIME_SEC<br />
432                  TIME_WDAY<br />
433                  TIME<br />
434               </td>
435
436               <td>
437                  API_VERSION<br />
438                  THE_REQUEST<br />
439                  REQUEST_URI<br />
440                  REQUEST_FILENAME<br />
441                  IS_SUBREQ<br />
442                  HTTPS<br />
443                  REQUEST_SCHEME<br />
444               </td>
445             </tr>
446           </table>
447
448                 <p>These variables all
449                 correspond to the similarly named HTTP
450                 MIME-headers, C variables of the Apache HTTP Server or
451                 <code>struct tm</code> fields of the Unix system.
452                 Most are documented elsewhere in the Manual or in
453                 the CGI specification.</p>
454
455                 <p>SERVER_NAME and SERVER_PORT depend on the values of 
456                 <directive module="core">UseCanonicalName</directive> and
457                 <directive module="core">UseCanonicalPhysicalPort</directive>
458                 respectively.</p>
459
460                 <p>Those that are special to mod_rewrite include those below.</p>
461         <note>
462                 <dl>
463                   <dt><code>IS_SUBREQ</code></dt>
464
465                   <dd>Will contain the text "true" if the request
466                   currently being processed is a sub-request,
467                   "false" otherwise. Sub-requests may be generated
468                   by modules that need to resolve additional files
469                   or URIs in order to complete their tasks.</dd>
470
471                   <dt><code>API_VERSION</code></dt>
472
473                   <dd>This is the version of the Apache httpd module API
474                   (the internal interface between server and
475                   module) in the current httpd build, as defined in
476                   include/ap_mmn.h. The module API version
477                   corresponds to the version of Apache httpd in use (in
478                   the release version of Apache httpd 1.3.14, for
479                   instance, it is 19990320:10), but is mainly of
480                   interest to module authors.</dd>
481
482                   <dt><code>THE_REQUEST</code></dt>
483
484                   <dd>The full HTTP request line sent by the
485                   browser to the server (e.g., "<code>GET
486                   /index.html HTTP/1.1</code>"). This does not
487                   include any additional headers sent by the
488                   browser.</dd>
489
490                   <dt><code>REQUEST_URI</code></dt>
491
492                   <dd>The resource requested in the HTTP request
493                   line. (In the example above, this would be
494                   "/index.html".)</dd>
495
496                   <dt><code>REQUEST_FILENAME</code></dt>
497
498                   <dd>The full local filesystem path to the file or
499                   script matching the request, if this has already
500                   been determined by the server at the time 
501                   <code>REQUEST_FILENAME</code> is referenced. Otherwise, 
502                   such as when used in virtual host context, the same 
503                   value as <code>REQUEST_URI</code>.</dd>
504
505                   <dt><code>HTTPS</code></dt>
506
507                   <dd>Will contain the text "on" if the connection is
508                   using SSL/TLS, or "off" otherwise.  (This variable
509                   can be safely used regardless of whether or not
510                   <module>mod_ssl</module> is loaded).</dd>
511
512                   <dt><code>REQUEST_SCHEME</code></dt>
513
514                   <dd>Will contain the scheme of the request (ususally
515                   "http" or "https"). This value can be influenced with
516                   <directive module="core">ServerName</directive>.</dd>
517
518                 </dl>
519 </note>
520         </li>
521       </ul>
522
523       <p>If the <em>TestString</em> has the special value <code>expr</code>, the
524       <em>CondPattern</em> will be treated as a
525       <a href="../expr.html">ap_expr</a>.</p>
526
527       <p>Other things you should be aware of:</p>
528
529       <ol>
530         <li>
531         <p>The variables SCRIPT_FILENAME and REQUEST_FILENAME
532         contain the same value - the value of the
533         <code>filename</code> field of the internal
534         <code>request_rec</code> structure of the Apache HTTP Server.
535         The first name is the commonly known CGI variable name
536         while the second is the appropriate counterpart of
537         REQUEST_URI (which contains the value of the
538         <code>uri</code> field of <code>request_rec</code>).</p>
539         <p>If a substitution occurred and the rewriting continues,
540         the value of both variables will be updated accordingly.</p>
541         <p>If used in per-server context (<em>i.e.</em>, before the
542         request is mapped to the filesystem) SCRIPT_FILENAME and
543         REQUEST_FILENAME cannot contain the full local filesystem
544         path since the path is unknown at this stage of processing.
545         Both variables will initially contain the value of REQUEST_URI
546         in that case. In order to obtain the full local filesystem
547         path of the request in per-server context, use an URL-based
548         look-ahead <code>%{LA-U:REQUEST_FILENAME}</code> to determine
549         the final value of REQUEST_FILENAME.</p></li>
550
551         <li>
552         <code>%{ENV:variable}</code>, where <em>variable</em> can be
553         any environment variable, is also available.
554         This is looked-up via internal
555         Apache httpd structures and (if not found there) via
556         <code>getenv()</code> from the Apache httpd server process.</li>
557
558         <li>
559         <code>%{SSL:variable}</code>, where <em>variable</em> is the
560         name of an <a href="mod_ssl.html#envvars">SSL environment
561         variable</a>, can be used whether or not
562         <module>mod_ssl</module> is loaded, but will always expand to
563         the empty string if it is not.  Example:
564         <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to
565         <code>128</code>.</li>
566
567         <li>
568         <code>%{HTTP:header}</code>, where <em>header</em> can be
569         any HTTP MIME-header name, can always be used to obtain the
570         value of a header sent in the HTTP request.
571         Example: <code>%{HTTP:Proxy-Connection}</code> is
572         the value of the HTTP header
573         ``<code>Proxy-Connection:</code>''.
574         <p>If a HTTP header is used in a condition this header is added to
575         the Vary header of the response in case the condition evaluates to
576         to true for the request. It is <strong>not</strong> added if the
577         condition evaluates to false for the request. Adding the HTTP header
578         to the Vary header of the response is needed for proper caching.</p>
579         <p>It has to be kept in mind that conditions follow a short circuit
580         logic in the case of the '<strong><code>ornext|OR</code></strong>' flag
581         so that certain conditions might not be evaluated at all.</p></li>
582
583         <li>
584         <code>%{LA-U:variable}</code> can be used for look-aheads which perform
585         an internal (URL-based) sub-request to determine the final
586         value of <em>variable</em>. This can be used to access
587         variable for rewriting which is not available at the current
588         stage, but will be set in a later phase.
589         <p>For instance, to rewrite according to the
590         <code>REMOTE_USER</code> variable from within the
591         per-server context (<code>httpd.conf</code> file) you must
592         use <code>%{LA-U:REMOTE_USER}</code> - this
593         variable is set by the authorization phases, which come
594         <em>after</em> the URL translation phase (during which mod_rewrite
595         operates).</p>
596         <p>On the other hand, because mod_rewrite implements
597         its per-directory context (<code>.htaccess</code> file) via
598         the Fixup phase of the API and because the authorization
599         phases come <em>before</em> this phase, you just can use
600         <code>%{REMOTE_USER}</code> in that context.</p></li>
601
602         <li>
603         <code>%{LA-F:variable}</code> can be used to perform an internal
604         (filename-based) sub-request, to determine the final value
605         of <em>variable</em>. Most of the time, this is the same as
606         LA-U above.</li>
607       </ol>
608
609       <p><em>CondPattern</em> is the condition pattern,
610        a regular expression which is applied to the
611       current instance of the <em>TestString</em>.
612       <em>TestString</em> is first evaluated, before being matched against
613       <em>CondPattern</em>.</p>
614
615       <p><em>CondPattern</em> is usually a
616       <em>perl compatible regular expression</em>, but there is
617       additional syntax available to perform other useful tests against
618       the <em>Teststring</em>:</p>
619
620       <ol>
621         <li>You can prefix the pattern string with a
622         '<code>!</code>' character (exclamation mark) to specify a
623         <strong>non</strong>-matching pattern.</li>
624
625         <li>
626           You can perform lexicographical string comparisons:
627
628           <ul>
629             <li>'<strong>&lt;CondPattern</strong>' (lexicographically
630             precedes)<br />
631             Treats the <em>CondPattern</em> as a plain string and
632             compares it lexicographically to <em>TestString</em>. True if
633             <em>TestString</em> lexicographically precedes
634             <em>CondPattern</em>.</li>
635
636             <li>'<strong>&gt;CondPattern</strong>' (lexicographically
637             follows)<br />
638             Treats the <em>CondPattern</em> as a plain string and
639             compares it lexicographically to <em>TestString</em>. True if
640             <em>TestString</em> lexicographically follows
641             <em>CondPattern</em>.</li>
642
643             <li>'<strong>=CondPattern</strong>' (lexicographically
644             equal)<br />
645             Treats the <em>CondPattern</em> as a plain string and
646             compares it lexicographically to <em>TestString</em>. True if
647             <em>TestString</em> is lexicographically equal to
648             <em>CondPattern</em> (the two strings are exactly
649             equal, character for character). If <em>CondPattern</em>
650             is <code>""</code> (two quotation marks) this
651             compares <em>TestString</em> to the empty string.</li>
652
653             <li>'<strong>&lt;=CondPattern</strong>' (lexicographically
654             less than or equal to)<br />
655             Treats the <em>CondPattern</em> as a plain string and
656             compares it lexicographically to <em>TestString</em>. True
657             if <em>TestString</em> lexicographically precedes
658             <em>CondPattern</em>, or is equal to <em>CondPattern</em>
659             (the two strings are equal, character for character).</li>
660
661             <li>'<strong>&gt;=CondPattern</strong>' (lexicographically
662             greater than or equal to)<br />
663             Treats the <em>CondPattern</em> as a plain string and
664             compares it lexicographically to <em>TestString</em>. True
665             if <em>TestString</em> lexicographically follows
666             <em>CondPattern</em>, or is equal to <em>CondPattern</em>
667             (the two strings are equal, character for character).</li>
668         </ul></li>
669
670         <li>
671           You can perform integer comparisons:
672           <ul>
673
674             <li>'<strong>-eq</strong>' (is numerically
675             <strong>eq</strong>ual to)<br />
676             The <em>TestString</em> is treated as an integer, and is
677             numerically compared to the <em>CondPattern</em>. True if
678             the two are numerically equal.</li>
679
680             <li>'<strong>-ge</strong>' (is numerically
681             <strong>g</strong>reater than or <strong>e</strong>qual to)<br />
682             The <em>TestString</em> is treated as an integer, and is
683             numerically compared to the <em>CondPattern</em>. True if
684             the <em>TestString</em> is numerically greater than or equal
685             to the <em>CondPattern</em>.</li>
686             
687              <li>'<strong>-gt</strong>' (is numerically
688             <strong>g</strong>reater <strong>t</strong>han)<br />
689             The <em>TestString</em> is treated as an integer, and is
690             numerically compared to the <em>CondPattern</em>. True if
691             the <em>TestString</em> is numerically greater than
692             the <em>CondPattern</em>.</li>
693
694             <li>'<strong>-le</strong>' (is numerically
695             <strong>l</strong>ess than or <strong>e</strong>qual to)<br />
696             The <em>TestString</em> is treated as an integer, and is
697             numerically compared to the <em>CondPattern</em>. True if
698             the <em>TestString</em> is numerically less than or equal
699             to the <em>CondPattern</em>. Avoid confusion with the
700             <strong>-l</strong> by using the <strong>-L</strong> or
701             <strong>-h</strong> variant.</li>
702             
703              <li>'<strong>-lt</strong>' (is numerically
704             <strong>l</strong>ess <strong>t</strong>han)<br />
705             The <em>TestString</em> is treated as an integer, and is
706             numerically compared to the <em>CondPattern</em>. True if
707             the <em>TestString</em> is numerically less than
708             the <em>CondPattern</em>. Avoid confusion with the
709             <strong>-l</strong> by using the <strong>-L</strong> or
710             <strong>-h</strong> variant.</li>
711
712            </ul>
713         </li>
714
715         <li>You can perform various file attribute tests:
716           <ul>
717             <li>'<strong>-d</strong>' (is
718             <strong>d</strong>irectory)<br />
719              Treats the <em>TestString</em> as a pathname and tests
720             whether or not it exists, and is a directory.</li>
721
722             <li>'<strong>-f</strong>' (is regular
723             <strong>f</strong>ile)<br />
724              Treats the <em>TestString</em> as a pathname and tests
725             whether or not it exists, and is a regular file.</li>
726
727             <li>'<strong>-F</strong>' (is existing file, via
728             subrequest)<br />
729             Checks whether or not <em>TestString</em> is a valid file,
730             accessible via all the server's currently-configured
731             access controls for that path. This uses an internal
732             subrequest to do the check, so use it with care -
733             it can impact your server's performance!</li>
734
735             <li>'<strong>-H</strong>' (is symbolic link, bash convention)<br />
736             See <strong>-l</strong>.</li>
737
738             <li>'<strong>-l</strong>' (is symbolic
739             <strong>l</strong>ink)<br />
740             Treats the <em>TestString</em> as a pathname and tests
741             whether or not it exists, and is a symbolic link. May also
742             use the bash convention of <strong>-L</strong> or
743             <strong>-h</strong> if there's a possibility of confusion
744             such as when using the <strong>-lt</strong> or
745             <strong>-le</strong> tests.</li>
746
747             <li>'<strong>-L</strong>' (is symbolic link, bash convention)<br />
748             See <strong>-l</strong>.</li>
749
750             <li>'<strong>-s</strong>' (is regular file, with
751             <strong>s</strong>ize)<br />
752             Treats the <em>TestString</em> as a pathname and tests
753             whether or not it exists, and is a regular file with size greater
754             than zero.</li>
755
756             <li>'<strong>-U</strong>' (is existing URL, via
757             subrequest)<br />
758             Checks whether or not <em>TestString</em> is a valid URL,
759             accessible via all the server's currently-configured
760             access controls for that path. This uses an internal
761             subrequest to do the check, so use it with care -
762             it can impact your server's performance!</li>
763
764             <li>'<strong>-x</strong>' (has e<strong>x</strong>ecutable
765             permissions)<br />
766             Treats the <em>TestString</em> as a pathname and tests
767             whether or not it exists, and has executable permissions.
768             These permissions are determined according to
769             the underlying OS.</li>
770
771           </ul>
772
773 <note><title>Note:</title>
774               All of these tests can
775               also be prefixed by an exclamation mark ('!') to
776               negate their meaning.
777 </note>
778         </li>
779
780         <li>
781            <p>If the <em>TestString</em> has the special value <code>expr</code>, the
782            <em>CondPattern</em> will be treated as a
783            <a href="../expr.html">ap_expr</a>.</p>
784
785            <p>
786             In the below example, <code>-strmatch</code> is used to
787             compare the <code>REFERER</code> against the site hostname,
788             to block unwanted hotlinking.
789            </p>
790
791            <example>
792            RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"<br />
793            RewriteRule ^/images - [F]
794            </example>
795         </li>
796
797         <li>You can also set special flags for
798       <em>CondPattern</em> by appending
799         <strong><code>[</code><em>flags</em><code>]</code></strong>
800       as the third argument to the <code>RewriteCond</code>
801       directive, where <em>flags</em> is a comma-separated list of any of the
802       following flags:
803
804       <ul>
805         <li>'<strong><code>nocase|NC</code></strong>'
806         (<strong>n</strong>o <strong>c</strong>ase)<br />
807         This makes the test case-insensitive - differences
808         between 'A-Z' and 'a-z' are ignored, both in the
809         expanded <em>TestString</em> and the <em>CondPattern</em>.
810         This flag is effective only for comparisons between
811         <em>TestString</em> and <em>CondPattern</em>. It has no
812         effect on filesystem and subrequest checks.</li>
813
814         <li>
815           '<strong><code>ornext|OR</code></strong>'
816           (<strong>or</strong> next condition)<br />
817           Use this to combine rule conditions with a local OR
818           instead of the implicit AND. Typical example:
819
820 <example>
821 <pre>
822 RewriteCond %{REMOTE_HOST}  ^host1  [OR]
823 RewriteCond %{REMOTE_HOST}  ^host2  [OR]
824 RewriteCond %{REMOTE_HOST}  ^host3
825 RewriteRule ...some special stuff for any of these hosts...
826 </pre>
827 </example>
828
829           Without this flag you would have to write the condition/rule
830           pair three times.
831         </li>
832
833         <li>'<strong><code>novary|NV</code></strong>'
834         (<strong>n</strong>o <strong>v</strong>ary)<br />
835         If a HTTP header is used in the condition, this flag prevents
836         this header from being added to the Vary header of the response. <br />
837         Using this flag might break proper caching of the response if
838         the representation of this response varies on the value of this header.
839         So this flag should be only used if the meaning of the Vary header
840         is well understood.
841         </li>
842       </ul>
843       </li>
844      </ol>
845
846       <p><strong>Example:</strong></p>
847
848        <p>To rewrite the Homepage of a site according to the
849         ``<code>User-Agent:</code>'' header of the request, you can
850         use the following: </p>
851
852 <example>
853 <pre>
854 RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla
855 RewriteRule  ^/$                 /homepage.max.html  [L]
856
857 RewriteCond  %{HTTP_USER_AGENT}  ^Lynx
858 RewriteRule  ^/$                 /homepage.min.html  [L]
859
860 RewriteRule  ^/$                 /homepage.std.html  [L]
861 </pre>
862 </example>
863
864         <p>Explanation: If you use a browser which identifies itself
865         as 'Mozilla' (including Netscape Navigator, Mozilla etc), then you
866         get the max homepage (which could include frames, or other special
867         features).
868         If you use the Lynx browser (which is terminal-based), then
869         you get the min homepage (which could be a version designed for
870         easy, text-only browsing).
871         If neither of these conditions apply (you use any other browser,
872         or your browser identifies itself as something non-standard), you get
873         the std (standard) homepage.</p>
874
875 </usage>
876
877 </directivesynopsis>
878
879 <directivesynopsis>
880 <name>RewriteRule</name>
881 <description>Defines rules for the rewriting engine</description>
882 <syntax>RewriteRule
883       <em>Pattern</em> <em>Substitution</em> [<em>flags</em>]</syntax>
884 <contextlist><context>server config</context><context>virtual host</context>
885 <context>directory</context><context>.htaccess</context></contextlist>
886 <override>FileInfo</override>
887
888 <usage>
889       <p>The <directive>RewriteRule</directive> directive is the real
890       rewriting workhorse. The directive can occur more than once,
891       with each instance defining a single rewrite rule. The
892       order in which these rules are defined is important - this is the order
893       in which they will be applied at run-time.</p>
894
895       <p><a id="patterns" name="patterns"><em>Pattern</em></a> is
896       a perl compatible <a id="regexp" name="regexp">regular
897       expression</a>. On the first RewriteRule it is applied to the (%-encoded)
898       <a href="./directive-dict.html#Syntax">URL-path</a> of the request;
899       subsequent patterns are applied to the output of the last matched
900       RewriteRule.</p>
901
902 <note><title>What is matched?</title>
903       <p>In <directive module="core">VirtualHost</directive> context, 
904       The <em>Pattern</em> will initially be matched against the part of the
905       URL after the hostname and port, and before the query string (e.g. "/app1/index.html").</p>
906
907       <p>In <directive module="core">Directory</directive> and htaccess context,
908       the <em>Pattern</em> will initially be matched against the  
909       <em>filesystem</em> path, after removing the prefix that lead the server
910       to the current <directive>RewriteRule</directive> (e.g. "app1/index.html" 
911       or "index.html" depending on where the directives are defined).</p>
912        
913       <p>If you wish to match against the hostname, port, or query string, use a
914       <directive module="mod_rewrite">RewriteCond</directive> with the
915       <code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, or
916       <code>%{QUERY_STRING}</code> variables respectively.</p>
917
918 </note>
919
920 <note><title>Per-directory Rewrites</title>
921 <ul>
922 <li>The rewrite engine may be used in <a
923 href="../howto/htaccess.html">.htaccess</a> files and in <directive type="section"
924 module="core">Directory</directive> sections, with some additional
925 complexity.</li>
926
927 <li>To enable the rewrite engine in this context, you need to set
928 "<code>RewriteEngine On</code>" <strong>and</strong>
929 "<code>Options FollowSymLinks</code>" must be enabled. If your
930 administrator has disabled override of <code>FollowSymLinks</code> for
931 a user's directory, then you cannot use the rewrite engine. This
932 restriction is required for security reasons.</li>
933
934 <li>When using the rewrite engine in <code>.htaccess</code> files the
935 per-directory prefix (which always is the same for a specific
936 directory) is automatically <em>removed</em> for the RewriteRule pattern matching
937 and automatically <em>added</em> after any relative (not starting with a
938 slash or protocol name) substitution encounters the end of a rule set.  
939 See the <directive module="mod_rewrite">RewriteBase</directive> 
940 directive for more information regarding what prefix will be added back to 
941 relative substutions.</li>
942
943 <li> If you wish to match against the full URL-path in a per-directory 
944 (htaccess) RewriteRule, use the <code>%{REQUEST_URI}</code> variable in
945 a <directive>RewriteCond</directive>.</li>
946
947 <li>The removed prefix always ends with a slash, meaning the matching occurs against a string which
948 <em>never</em> has a leading slash.  Therefore, a <em>Pattern</em> with <code>^/</code> never
949 matches in per-directory context.</li>
950
951 <li>Although rewrite rules are syntactically permitted in <directive
952 type="section" module="core">Location</directive> and <directive
953 type="section" module="core">Files</directive> sections, this
954 should never be necessary and is unsupported.</li>
955 </ul>
956 </note>
957
958       <p>For some hints on <glossary ref="regex">regular
959       expressions</glossary>, see
960       the <a href="../rewrite/intro.html#regex">mod_rewrite
961       Introduction</a>.</p>
962
963       <p>In mod_rewrite, the NOT character
964       ('<code>!</code>') is also available as a possible pattern
965       prefix. This enables you to negate a pattern; to say, for instance:
966       ``<em>if the current URL does <strong>NOT</strong> match this
967       pattern</em>''. This can be used for exceptional cases, where
968       it is easier to match the negative pattern, or as a last
969       default rule.</p>
970
971 <note><title>Note</title>
972 When using the NOT character to negate a pattern, you cannot include
973 grouped wildcard parts in that pattern. This is because, when the
974 pattern does NOT match (ie, the negation matches), there are no
975 contents for the groups. Thus, if negated patterns are used, you
976 cannot use <code>$N</code> in the substitution string!
977 </note>
978
979       <p>The <a id="rhs" name="rhs"><em>Substitution</em></a> of a
980       rewrite rule is the string that replaces the original URL-path that
981       was matched by <em>Pattern</em>.  The <em>Substitution</em> may
982       be a:</p>
983
984       <dl>
985
986         <dt>file-system path</dt>
987
988         <dd>Designates the location on the file-system of the resource
989         to be delivered to the client.</dd>
990
991         <dt>URL-path</dt>
992
993         <dd>A <directive
994         module="core">DocumentRoot</directive>-relative path to the
995         resource to be served. Note that <module>mod_rewrite</module>
996         tries to guess whether you have specified a file-system path
997         or a URL-path by checking to see if the first segment of the
998         path exists at the root of the file-system. For example, if
999         you specify a <em>Substitution</em> string of
1000         <code>/www/file.html</code>, then this will be treated as a
1001         URL-path <em>unless</em> a directory named <code>www</code>
1002         exists at the root or your file-system, in which case it will
1003         be treated as a file-system path. If you wish other
1004         URL-mapping directives (such as <directive
1005         module="mod_alias">Alias</directive>) to be applied to the
1006         resulting URL-path, use the <code>[PT]</code> flag as
1007         described below.</dd>
1008
1009         <dt>Absolute URL</dt>
1010
1011         <dd>If an absolute URL is specified,
1012         <module>mod_rewrite</module> checks to see whether the
1013         hostname matches the current host. If it does, the scheme and
1014         hostname are stripped out and the resulting path is treated as
1015         a URL-path. Otherwise, an external redirect is performed for
1016         the given URL. To force an external redirect back to the
1017         current host, see the <code>[R]</code> flag below.</dd>
1018
1019         <dt><code>-</code> (dash)</dt>
1020
1021         <dd>A dash indicates that no substitution should be performed
1022         (the existing path is passed through untouched). This is used
1023         when a flag (see below) needs to be applied without changing
1024         the path.</dd>
1025
1026       </dl>
1027
1028       <p>In addition to plain text, the <em>Substition</em> string can include</p>
1029
1030       <ol>
1031         <li>back-references (<code>$N</code>) to the RewriteRule
1032         pattern</li>
1033
1034         <li>back-references (<code>%N</code>) to the last matched
1035         RewriteCond pattern</li>
1036
1037         <li>server-variables as in rule condition test-strings
1038         (<code>%{VARNAME}</code>)</li>
1039
1040         <li><a href="#mapfunc">mapping-function</a> calls
1041         (<code>${mapname:key|default}</code>)</li>
1042       </ol>
1043
1044       <p>Back-references are identifiers of the form
1045       <code>$</code><strong>N</strong>
1046       (<strong>N</strong>=0..9), which will be replaced
1047       by the contents of the <strong>N</strong>th group of the
1048       matched <em>Pattern</em>. The server-variables are the same
1049       as for the <em>TestString</em> of a <code>RewriteCond</code>
1050       directive. The mapping-functions come from the
1051       <code>RewriteMap</code> directive and are explained there.
1052       These three types of variables are expanded in the order above.</p>
1053
1054       <p>As already mentioned, all rewrite rules are
1055       applied to the <em>Substitution</em> (in the order in which
1056       they are defined
1057       in the config file). The URL is <strong>completely
1058       replaced</strong> by the <em>Substitution</em> and the
1059       rewriting process continues until all rules have been applied,
1060       or it is explicitly terminated by a
1061       <code><strong>L</strong></code> flag.</p>
1062
1063      <note><title>Modifying the Query String</title>
1064       <p>By default, the query string is passed through unchanged. You
1065       can, however, create URLs in the substitution string containing
1066       a query string part. Simply use a question mark inside the
1067       substitution string to indicate that the following text should
1068       be re-injected into the query string. When you want to erase an
1069       existing query string, end the substitution string with just a
1070       question mark. To combine new and old query strings, use the
1071       <code>[QSA]</code> flag.</p>
1072      </note>
1073
1074       <p>Additionally you can set special <a name="rewriteflags"
1075       id="rewriteflags">actions</a> to be performed by
1076       appending <strong><code>[</code><em>flags</em><code>]</code></strong>
1077       as the third argument to the <code>RewriteRule</code>
1078       directive. <em>Flags</em> is a comma-separated list, surround by square
1079       brackets, of any of the flags in the following table. More
1080       details, and examples, for each flag, are available in the <a
1081       href="../rewrite/flags.html">Rewrite Flags document</a>.</p>
1082
1083     <table border="1">
1084     <tr><th>Flag and syntax</th>
1085         <th>Function</th>
1086     </tr>
1087     <tr>
1088         <td>B</td>
1089         <td>Escape non-alphanumeric characters <em>before</em> applying
1090         the transformation. <em><a
1091         href="../rewrite/flags.html#flag_b">details ...</a></em></td>
1092     </tr>
1093     <tr>
1094         <td>chain|C</td>
1095         <td>Rule is chained to the following rule. If the rule fails,
1096         the rule(s) chained to it will be skipped. <em><a
1097         href="../rewrite/flags.html#flag_c">details ...</a></em></td>
1098     </tr>
1099     <tr>
1100         <td>cookie|CO=<em>NAME</em>:<em>VAL</em></td>
1101         <td>Sets a cookie in the client browser. Full syntax is: 
1102         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>
1103         </td>
1104     </tr>
1105     <tr>
1106         <td>discardpath|DPI</td>
1107         <td>Causes the PATH_INFO portion of the rewritten URI to be
1108         discarded. <em><a href="../rewrite/flags.html#flag_dpi">details 
1109         ...</a></em></td>
1110     </tr>
1111     <tr>
1112         <td>env|E=[!]<em>VAR</em>[:<em>VAL</em>]</td>
1113         <td>Causes an environment variable <em>VAR</em> to be set (to the
1114         value <em>VAL</em> if provided). The form !<em>VAR</em> causes
1115         the environment variable <em>VAR</em> to be unset.<em><a
1116         href="../rewrite/flags.html#flag_e">details ...</a></em></td>
1117     </tr>
1118     <tr>
1119         <td>forbidden|F</td>
1120         <td>Returns a 403 FORBIDDEN response to the client browser.
1121         <em><a href="../rewrite/flags.html#flag_f">details ...</a></em></td>
1122     </tr>
1123     <tr>
1124         <td>gone|G</td>
1125         <td>Returns a 410 GONE response to the client browser. <em><a
1126         href="../rewrite/flags.html#flag_g">details ...</a></em></td>
1127     </tr>
1128     <tr>
1129         <td>Handler|H=<em>Content-handler</em></td>
1130         <td>Causes the resulting URI to be sent to the specified
1131         <em>Content-handler</em> for processing. <em><a
1132         href="../rewrite/flags.html#flag_h">details ...</a></em></td>
1133     </tr>
1134     <tr>
1135         <td>last|L</td>
1136         <td>Stop the rewriting process immediately and don't apply any
1137         more rules. Especially note caveats for per-directory and
1138         .htaccess context (see also the END flag). <em><a
1139         href="../rewrite/flags.html#flag_l">details ...</a></em></td>
1140     </tr>
1141     <tr>
1142         <td>next|N</td>
1143         <td>Re-run the rewriting process, starting again with the first
1144         rule, using the result of the ruleset so far as a starting
1145         point. <em><a href="../rewrite/flags.html#flag_n">details
1146         ...</a></em></td>
1147     </tr>
1148     <tr>
1149         <td>nocase|NC</td>
1150         <td>Makes the pattern pattern comparison case-insensitive.
1151         <em><a href="../rewrite/flags.html#flag_nc">details ...</a></em></td>
1152     </tr>
1153     <tr>
1154         <td>noescape|NE</td>
1155         <td>Prevent mod_rewrite from applying hexcode escaping of
1156         special characters in the result of the rewrite. <em><a
1157         href="../rewrite/flags.html#flag_ne">details ...</a></em></td>
1158     </tr>
1159     <tr>
1160         <td>nosubreq|NS</td>
1161         <td>Causes a rule to be skipped if the current request is an
1162         internal sub-request. <em><a
1163         href="../rewrite/flags.html#flag_ns">details ...</a></em></td>
1164     </tr>
1165     <tr>
1166         <td>proxy|P</td>
1167         <td>Force the substitution URL to be internally sent as a proxy
1168         request. <em><a href="../rewrite/flags.html#flag_p">details
1169         ...</a></em></td>
1170     </tr>
1171     <tr>
1172         <td>passthrough|PT</td>
1173         <td>Forces the resulting URI to be passed back to the URL
1174         mapping engine for processing of other URI-to-filename
1175         translators, such as <code>Alias</code> or
1176         <code>Redirect</code>. <em><a
1177         href="../rewrite/flags.html#flag_pt">details ...</a></em></td>
1178     </tr>
1179     <tr>
1180         <td>qsappend|QSA</td>
1181         <td>Appends any query string created in the rewrite target to
1182         any query string that was in the original request URL. <em><a
1183         href="../rewrite/flags.html#flag_qsa">details ...</a></em></td>
1184     </tr>
1185     <tr>
1186         <td>qsdiscard|QSD</td>
1187         <td>Discard any query string attached to the incoming URI.
1188         <em><a href="../rewrite/flags.html#flag_qsd">details
1189         ...</a></em></td>
1190     </tr>
1191     <tr>
1192         <td>redirect|R[=<em>code</em>]</td>
1193         <td>Forces an external redirect, optionally with the specified
1194         HTTP status code. <em><a
1195         href="../rewrite/flags.html#flag_r">details ...</a></em>
1196         </td>
1197     </tr>
1198     <tr>
1199         <td>END</td>
1200         <td>Stop the rewriting process immediately and don't apply any
1201         more rules. Also prevents further execution of rewrite rules
1202         in per-directory and .htaccess context. (Available in 2.3.9 and later)
1203         <em><a href="../rewrite/flags.html#flag_l">details ...</a></em></td>
1204     </tr>
1205     <tr>
1206         <td>skip|S=<em>num</em></td>
1207         <td>Tells the rewriting engine to skip the next <em>num</em>
1208         rules if the current rule matches. <em><a
1209         href="../rewrite/flags.html#flag_s">details ...</a></em></td>
1210     </tr>
1211     <tr>
1212         <td>tyle|T=<em>MIME-type</em></td>
1213         <td>Force the <glossary>MIME-type</glossary> of the target file
1214         to be the specified type. <em><a
1215         href="../rewrite/flags.html#flag_t">details ...</a></em></td>
1216     </tr>
1217     </table>
1218
1219 <note><title>Home directory expansion</title>
1220 <p> When the substitution string begins with a string
1221 resembling "/~user" (via explicit text or backreferences), mod_rewrite performs
1222 home directory expansion independent of the presence or configuration
1223 of <module>mod_userdir</module>.</p>
1224
1225 <p> This expansion does not occur when the <em>PT</em>
1226 flag is used on the <directive module="mod_rewrite">RewriteRule</directive>
1227 directive.</p>
1228 </note>
1229
1230
1231      <p>Here are all possible substitution combinations and their
1232       meanings:</p>
1233
1234       <p><strong>Inside per-server configuration
1235       (<code>httpd.conf</code>)<br />
1236        for request ``<code>GET
1237       /somepath/pathinfo</code>'':</strong><br />
1238       </p>
1239
1240 <table border="1">
1241 <tr>
1242 <th>Given Rule</th>
1243 <th>Resulting Substitution</th>
1244 </tr>
1245
1246 <tr>
1247 <td>^/somepath(.*) otherpath$1</td>
1248 <td>invalid, not supported</td>
1249 </tr>
1250
1251 <tr>
1252 <td>^/somepath(.*) otherpath$1  [R]</td>
1253 <td>invalid, not supported</td>
1254 </tr>
1255
1256 <tr>
1257 <td>^/somepath(.*) otherpath$1  [P]</td>
1258 <td>invalid, not supported</td>
1259 </tr>
1260
1261 <tr>
1262 <td>^/somepath(.*) /otherpath$1</td>
1263 <td>/otherpath/pathinfo</td>
1264 </tr>
1265
1266 <tr>
1267 <td>^/somepath(.*) /otherpath$1 [R]</td>
1268 <td>http://thishost/otherpath/pathinfo via external redirection</td>
1269 </tr>
1270
1271 <tr>
1272 <td>^/somepath(.*) /otherpath$1 [P]</td>
1273 <td>doesn't make sense, not supported</td>
1274 </tr>
1275
1276 <tr>
1277 <td>^/somepath(.*) http://thishost/otherpath$1</td>
1278 <td>/otherpath/pathinfo</td>
1279 </tr>
1280
1281 <tr>
1282 <td>^/somepath(.*) http://thishost/otherpath$1 [R]</td>
1283 <td>http://thishost/otherpath/pathinfo via external redirection</td>
1284 </tr>
1285
1286 <tr>
1287 <td>^/somepath(.*) http://thishost/otherpath$1 [P]</td>
1288 <td>doesn't make sense, not supported</td>
1289 </tr>
1290
1291 <tr>
1292 <td>^/somepath(.*) http://otherhost/otherpath$1</td>
1293 <td>http://otherhost/otherpath/pathinfo via external redirection</td>
1294 </tr>
1295
1296 <tr>
1297 <td>^/somepath(.*) http://otherhost/otherpath$1 [R]</td>
1298 <td>http://otherhost/otherpath/pathinfo via external redirection (the [R] flag is redundant)</td>
1299 </tr>
1300
1301 <tr>
1302 <td>^/somepath(.*) http://otherhost/otherpath$1 [P]</td>
1303 <td>http://otherhost/otherpath/pathinfo via internal proxy</td>
1304 </tr>
1305 </table>
1306
1307       <p><strong>Inside per-directory configuration for
1308       <code>/somepath</code><br />
1309        (<code>/physical/path/to/somepath/.htacccess</code>, with
1310       <code>RewriteBase /somepath</code>)<br />
1311        for request ``<code>GET
1312       /somepath/localpath/pathinfo</code>'':</strong><br />
1313      </p>
1314
1315 <table border="1">
1316
1317 <tr>
1318 <th>Given Rule</th>
1319 <th>Resulting Substitution</th>
1320 </tr>
1321
1322 <tr>
1323 <td>^localpath(.*) otherpath$1</td>
1324 <td>/somepath/otherpath/pathinfo</td>
1325 </tr>
1326
1327 <tr>
1328 <td>^localpath(.*) otherpath$1  [R]</td>
1329 <td>http://thishost/somepath/otherpath/pathinfo via external
1330 redirection</td>
1331 </tr>
1332
1333 <tr>
1334 <td>^localpath(.*) otherpath$1  [P]</td>
1335 <td>doesn't make sense, not supported</td>
1336 </tr>
1337
1338 <tr>
1339 <td>^localpath(.*) /otherpath$1</td>
1340 <td>/otherpath/pathinfo</td>
1341 </tr>
1342
1343 <tr>
1344 <td>^localpath(.*) /otherpath$1 [R]</td>
1345 <td>http://thishost/otherpath/pathinfo via external redirection</td>
1346 </tr>
1347
1348 <tr>
1349 <td>^localpath(.*) /otherpath$1 [P]</td>
1350 <td>doesn't make sense, not supported</td>
1351 </tr>
1352
1353 <tr>
1354 <td>^localpath(.*) http://thishost/otherpath$1</td>
1355 <td>/otherpath/pathinfo</td>
1356 </tr>
1357
1358 <tr>
1359 <td>^localpath(.*) http://thishost/otherpath$1 [R]</td>
1360 <td>http://thishost/otherpath/pathinfo via external redirection</td>
1361 </tr>
1362
1363 <tr>
1364 <td>^localpath(.*) http://thishost/otherpath$1 [P]</td>
1365 <td>doesn't make sense, not supported</td>
1366 </tr>
1367
1368 <tr>
1369 <td>^localpath(.*) http://otherhost/otherpath$1</td>
1370 <td>http://otherhost/otherpath/pathinfo via external redirection</td>
1371 </tr>
1372
1373 <tr>
1374 <td>^localpath(.*) http://otherhost/otherpath$1 [R]</td>
1375 <td>http://otherhost/otherpath/pathinfo via external redirection (the [R] flag is redundant)</td>
1376 </tr>
1377
1378 <tr>
1379 <td>^localpath(.*) http://otherhost/otherpath$1 [P]</td>
1380 <td>http://otherhost/otherpath/pathinfo via internal proxy</td>
1381 </tr>
1382
1383 </table>
1384
1385   </usage>
1386  </directivesynopsis>
1387 </modulesynopsis>