home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / Apache / apache_2.0.52-win32-x86-no_ssl.msi / Data.Cab / F278353_mod_rewrite.xml < prev    next >
Extensible Markup Language  |  2004-08-27  |  77KB  |  1,802 lines

  1. <?xml version="1.0"?>
  2. <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
  3. <?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
  4. <!-- $Revision: 1.11.2.11 $ -->
  5.  
  6. <!--
  7.  Copyright 2002-2004 The Apache Software Foundation
  8.  
  9.  Licensed under the Apache License, Version 2.0 (the "License");
  10.  you may not use this file except in compliance with the License.
  11.  You may obtain a copy of the License at
  12.  
  13.      http://www.apache.org/licenses/LICENSE-2.0
  14.  
  15.  Unless required by applicable law or agreed to in writing, software
  16.  distributed under the License is distributed on an "AS IS" BASIS,
  17.  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18.  See the License for the specific language governing permissions and
  19.  limitations under the License.
  20. -->
  21.  
  22. <modulesynopsis metafile="mod_rewrite.xml.meta">
  23.  
  24. <name>mod_rewrite</name> 
  25.  
  26. <description>Provides a rule-based rewriting engine to rewrite requested
  27. URLs on the fly</description>
  28.  
  29. <status>Extension</status>
  30. <sourcefile>mod_rewrite.c</sourcefile>
  31. <identifier>rewrite_module</identifier>
  32. <compatibility>Available in Apache 1.3 and later</compatibility>
  33.  
  34. <summary>
  35.       <blockquote>
  36.             <p>``The great thing about mod_rewrite is it gives you
  37.             all the configurability and flexibility of Sendmail.
  38.             The downside to mod_rewrite is that it gives you all
  39.             the configurability and flexibility of Sendmail.''</p>
  40.  
  41.             <p class="cite">-- <cite>Brian Behlendorf</cite><br />
  42.             Apache Group</p>
  43.  
  44.       </blockquote>
  45.  
  46.       <blockquote>
  47.             <p>`` Despite the tons of examples and docs,
  48.             mod_rewrite is voodoo. Damned cool voodoo, but still
  49.             voodoo. ''</p>
  50.  
  51.             <p class="cite">-- <cite>Brian Moore</cite><br />
  52.             bem@news.cmc.net</p>
  53.  
  54.       </blockquote>
  55.  
  56.  
  57.       <p>Welcome to mod_rewrite, the Swiss Army Knife of URL
  58.       manipulation!</p>
  59.  
  60.       <p>This module uses a rule-based rewriting engine (based on a
  61.       regular-expression parser) to rewrite requested URLs on the
  62.       fly. It supports an unlimited number of rules and an
  63.       unlimited number of attached rule conditions for each rule to
  64.       provide a really flexible and powerful URL manipulation
  65.       mechanism. The URL manipulations can depend on various tests,
  66.       for instance server variables, environment variables, HTTP
  67.       headers, time stamps and even external database lookups in
  68.       various formats can be used to achieve a really granular URL
  69.       matching.</p>
  70.  
  71.       <p>This module operates on the full URLs (including the
  72.       path-info part) both in per-server context
  73.       (<code>httpd.conf</code>) and per-directory context
  74.       (<code>.htaccess</code>) and can even generate query-string
  75.       parts on result. The rewritten result can lead to internal
  76.       sub-processing, external request redirection or even to an
  77.       internal proxy throughput.</p>
  78.  
  79.       <p>But all this functionality and flexibility has its
  80.       drawback: complexity. So don't expect to understand this
  81.       entire module in just one day.</p>
  82.  
  83.       <p>This module was invented and originally written in April
  84.       1996 and gifted exclusively to the The Apache Group in July 1997
  85.       by</p>
  86.  
  87.       <p class="indent">
  88.         <a href="http://www.engelschall.com/"><code>Ralf S.
  89.         Engelschall</code></a><br />
  90.          <a
  91.         href="mailto:rse@engelschall.com"><code>rse@engelschall.com</code></a><br />
  92.          <a
  93.         href="http://www.engelschall.com/"><code>www.engelschall.com</code></a>
  94.       </p>
  95. </summary>
  96.  
  97. <section id="Internal"><title>Internal Processing</title>
  98.  
  99.       <p>The internal processing of this module is very complex but
  100.       needs to be explained once even to the average user to avoid
  101.       common mistakes and to let you exploit its full
  102.       functionality.</p>
  103.  
  104. <section id="InternalAPI"><title>API Phases</title>
  105.  
  106.       <p>First you have to understand that when Apache processes a
  107.       HTTP request it does this in phases. A hook for each of these
  108.       phases is provided by the Apache API. Mod_rewrite uses two of
  109.       these hooks: the URL-to-filename translation hook which is
  110.       used after the HTTP request has been read but before any
  111.       authorization starts and the Fixup hook which is triggered
  112.       after the authorization phases and after the per-directory
  113.       config files (<code>.htaccess</code>) have been read, but
  114.       before the content handler is activated.</p>
  115.  
  116.       <p>So, after a request comes in and Apache has determined the
  117.       corresponding server (or virtual server) the rewriting engine
  118.       starts processing of all mod_rewrite directives from the
  119.       per-server configuration in the URL-to-filename phase. A few
  120.       steps later when the final data directories are found, the
  121.       per-directory configuration directives of mod_rewrite are
  122.       triggered in the Fixup phase. In both situations mod_rewrite
  123.       rewrites URLs either to new URLs or to filenames, although
  124.       there is no obvious distinction between them. This is a usage
  125.       of the API which was not intended to be this way when the API
  126.       was designed, but as of Apache 1.x this is the only way
  127.       mod_rewrite can operate. To make this point more clear
  128.       remember the following two points:</p>
  129.  
  130.       <ol>
  131.         <li>Although mod_rewrite rewrites URLs to URLs, URLs to
  132.         filenames and even filenames to filenames, the API
  133.         currently provides only a URL-to-filename hook. In Apache
  134.         2.0 the two missing hooks will be added to make the
  135.         processing more clear. But this point has no drawbacks for
  136.         the user, it is just a fact which should be remembered:
  137.         Apache does more in the URL-to-filename hook than the API
  138.         intends for it.</li>
  139.  
  140.         <li>
  141.           Unbelievably mod_rewrite provides URL manipulations in
  142.           per-directory context, <em>i.e.</em>, within
  143.           <code>.htaccess</code> files, although these are reached
  144.           a very long time after the URLs have been translated to
  145.           filenames. It has to be this way because
  146.           <code>.htaccess</code> files live in the filesystem, so
  147.           processing has already reached this stage. In other
  148.           words: According to the API phases at this time it is too
  149.           late for any URL manipulations. To overcome this chicken
  150.           and egg problem mod_rewrite uses a trick: When you
  151.           manipulate a URL/filename in per-directory context
  152.           mod_rewrite first rewrites the filename back to its
  153.           corresponding URL (which is usually impossible, but see
  154.           the <code>RewriteBase</code> directive below for the
  155.           trick to achieve this) and then initiates a new internal
  156.           sub-request with the new URL. This restarts processing of
  157.           the API phases. 
  158.  
  159.           <p>Again mod_rewrite tries hard to make this complicated
  160.           step totally transparent to the user, but you should
  161.           remember here: While URL manipulations in per-server
  162.           context are really fast and efficient, per-directory
  163.           rewrites are slow and inefficient due to this chicken and
  164.           egg problem. But on the other hand this is the only way
  165.           mod_rewrite can provide (locally restricted) URL
  166.           manipulations to the average user.</p>
  167.         </li>
  168.       </ol>
  169.  
  170.       <p>Don't forget these two points!</p>
  171. </section>
  172.  
  173. <section id="InternalRuleset"><title>Ruleset Processing</title>
  174.  
  175.       <p>Now when mod_rewrite is triggered in these two API phases, it
  176.       reads the configured rulesets from its configuration
  177.       structure (which itself was either created on startup for
  178.       per-server context or during the directory walk of the Apache
  179.       kernel for per-directory context). Then the URL rewriting
  180.       engine is started with the contained ruleset (one or more
  181.       rules together with their conditions). The operation of the
  182.       URL rewriting engine itself is exactly the same for both
  183.       configuration contexts. Only the final result processing is
  184.       different. </p>
  185.  
  186.       <p>The order of rules in the ruleset is important because the
  187.       rewriting engine processes them in a special (and not very
  188.       obvious) order. The rule is this: The rewriting engine loops
  189.       through the ruleset rule by rule (<directive
  190.       module="mod_rewrite">RewriteRule</directive> directives) and
  191.       when a particular rule matches it optionally loops through
  192.       existing corresponding conditions (<code>RewriteCond</code>
  193.       directives). For historical reasons the conditions are given
  194.       first, and so the control flow is a little bit long-winded. See
  195.       Figure 1 for more details.</p>
  196. <p class="figure">
  197.       <img src="../images/mod_rewrite_fig1.gif" width="428"
  198.            height="385" alt="[Needs graphics capability to display]" /><br />
  199.       <dfn>Figure 1:</dfn>The control flow through the rewriting ruleset
  200. </p>
  201.       <p>As you can see, first the URL is matched against the
  202.       <em>Pattern</em> of each rule. When it fails mod_rewrite
  203.       immediately stops processing this rule and continues with the
  204.       next rule. If the <em>Pattern</em> matches, mod_rewrite looks
  205.       for corresponding rule conditions. If none are present, it
  206.       just substitutes the URL with a new value which is
  207.       constructed from the string <em>Substitution</em> and goes on
  208.       with its rule-looping. But if conditions exist, it starts an
  209.       inner loop for processing them in the order that they are
  210.       listed. For conditions the logic is different: we don't match
  211.       a pattern against the current URL. Instead we first create a
  212.       string <em>TestString</em> by expanding variables,
  213.       back-references, map lookups, <em>etc.</em> and then we try
  214.       to match <em>CondPattern</em> against it. If the pattern
  215.       doesn't match, the complete set of conditions and the
  216.       corresponding rule fails. If the pattern matches, then the
  217.       next condition is processed until no more conditions are
  218.       available. If all conditions match, processing is continued
  219.       with the substitution of the URL with
  220.       <em>Substitution</em>.</p>
  221.  
  222. </section>
  223.  
  224. <section id="quoting"><title>Quoting Special Characters</title>
  225.  
  226.       <p>As of Apache 1.3.20, special characters in
  227.       <em>TestString</em> and <em>Substitution</em> strings can be
  228.       escaped (that is, treated as normal characters without their
  229.       usual special meaning) by prefixing them with a slosh ('\')
  230.       character. In other words, you can include an actual
  231.       dollar-sign character in a <em>Substitution</em> string by
  232.       using '<code>\$</code>'; this keeps mod_rewrite from trying
  233.       to treat it as a backreference.</p>
  234. </section>
  235.  
  236. <section id="InternalBackRefs"><title>Regex Back-Reference Availability</title>
  237.  
  238.       <p>One important thing here has to be remembered: Whenever you
  239.       use parentheses in <em>Pattern</em> or in one of the
  240.       <em>CondPattern</em>, back-references are internally created
  241.       which can be used with the strings <code>$N</code> and
  242.       <code>%N</code> (see below). These are available for creating
  243.       the strings <em>Substitution</em> and <em>TestString</em>.
  244.       Figure 2 shows to which locations the back-references are
  245.       transfered for expansion.</p>
  246.  
  247. <p class="figure">
  248.       <img src="../images/mod_rewrite_fig2.gif" width="381"
  249.            height="179" alt="[Needs graphics capability to display]" /><br />
  250.       <dfn>Figure 2:</dfn> The back-reference flow through a rule.
  251. </p>
  252.       <p>We know this was a crash course on mod_rewrite's internal
  253.       processing. But you will benefit from this knowledge when
  254.       reading the following documentation of the available
  255.       directives.</p>
  256.  
  257. </section>
  258. </section>
  259.  
  260. <section id="EnvVar"><title>Environment Variables</title>
  261.  
  262.       <p>This module keeps track of two additional (non-standard)
  263.       CGI/SSI environment variables named <code>SCRIPT_URL</code>
  264.       and <code>SCRIPT_URI</code>. These contain the
  265.       <em>logical</em> Web-view to the current resource, while the
  266.       standard CGI/SSI variables <code>SCRIPT_NAME</code> and
  267.       <code>SCRIPT_FILENAME</code> contain the <em>physical</em>
  268.       System-view. </p>
  269.  
  270.       <p>Notice: These variables hold the URI/URL <em>as they were
  271.       initially requested</em>, <em>i.e.</em>, <em>before</em> any
  272.       rewriting. This is important because the rewriting process is
  273.       primarily used to rewrite logical URLs to physical
  274.       pathnames.</p>
  275.  
  276. <example><title>Example</title>
  277. <pre>
  278. SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
  279. SCRIPT_FILENAME=/u/rse/.www/index.html
  280. SCRIPT_URL=/u/rse/
  281. SCRIPT_URI=http://en1.engelschall.com/u/rse/
  282. </pre>
  283. </example>
  284.  
  285. </section>
  286.  
  287. <section id="Solutions"><title>Practical Solutions</title>
  288.  
  289.       <p>We also have an <a href="../misc/rewriteguide.html">URL
  290.       Rewriting Guide</a> available, which provides a collection of
  291.       practical solutions for URL-based problems. There you can
  292.       find real-life rulesets and additional information about
  293.       mod_rewrite.</p>
  294. </section>
  295.  
  296.  
  297. <directivesynopsis>
  298. <name>RewriteEngine</name>
  299. <description>Enables or disables runtime rewriting engine</description>
  300. <syntax>RewriteEngine on|off</syntax>
  301. <default>RewriteEngine off</default>
  302. <contextlist><context>server config</context><context>virtual host</context>
  303. <context>directory</context><context>.htaccess</context></contextlist>
  304. <override>FileInfo</override>
  305.  
  306. <usage>       
  307.  
  308.       <p>The <directive>RewriteEngine</directive> directive enables or
  309.       disables the runtime rewriting engine. If it is set to
  310.       <code>off</code> this module does no runtime processing at
  311.       all. It does not even update the <code>SCRIPT_URx</code>
  312.       environment variables.</p>
  313.  
  314.       <p>Use this directive to disable the module instead of
  315.       commenting out all the <directive
  316.       module="mod_rewrite">RewriteRule</directive> directives!</p>
  317.  
  318.       <p>Note that, by default, rewrite configurations are not
  319.       inherited. This means that you need to have a
  320.       <code>RewriteEngine on</code> directive for each virtual host
  321.       in which you wish to use it.</p>
  322. </usage>
  323.  
  324. </directivesynopsis>
  325.  
  326. <directivesynopsis>
  327. <name>RewriteOptions</name>
  328. <description>Sets some special options for the rewrite engine</description>
  329. <syntax>RewriteOptions <var>Options</var></syntax>
  330. <default>RewriteOptions MaxRedirects=10</default>
  331. <contextlist><context>server config</context><context>virtual host</context>
  332. <context>directory</context><context>.htaccess</context></contextlist>
  333. <override>FileInfo</override>
  334. <compatibility><code>MaxRedirects</code> is available in Apache 2.0.45 and
  335. later</compatibility>
  336. <usage>
  337.  
  338.       <p>The <directive>RewriteOptions</directive> directive sets some
  339.       special options for the current per-server or per-directory
  340.       configuration. The <em>Option</em> strings can be one of the
  341.       following:</p>
  342.  
  343.       <dl>
  344.       <dt><code>inherit</code></dt>
  345.       <dd>This forces the current configuration to inherit the
  346.       configuration of the parent. In per-virtual-server context
  347.       this means that the maps, conditions and rules of the main
  348.       server are inherited. In per-directory context this means
  349.       that conditions and rules of the parent directory's
  350.       <code>.htaccess</code> configuration are inherited.</dd>
  351.  
  352.       <dt><code>MaxRedirects=<var>number</var></code></dt>
  353.       <dd>In order to prevent endless loops of internal redirects
  354.       issued by per-directory <directive module="mod_rewrite"
  355.       >RewriteRule</directive>s, <module>mod_rewrite</module> aborts
  356.       the request after reaching a maximum number of such redirects and
  357.       responds with an 500 Internal Server Error. If you really need
  358.       more internal redirects than 10 per request, you may increase
  359.       the default to the desired value.</dd>
  360.       </dl>
  361. </usage>
  362.  
  363. </directivesynopsis>
  364.  
  365. <directivesynopsis>
  366. <name>RewriteLog</name>
  367. <description>Sets the name of the file used for logging rewrite engine
  368. processing</description>
  369. <syntax>RewriteLog <em>file-path</em></syntax>
  370. <contextlist><context>server config</context><context>virtual host</context>
  371. </contextlist>
  372.  
  373. <usage>
  374.       <p>The <directive>RewriteLog</directive> directive sets the name
  375.       of the file to which the server logs any rewriting actions it
  376.       performs. If the name does not begin with a slash
  377.       ('<code>/</code>') then it is assumed to be relative to the
  378.       <em>Server Root</em>. The directive should occur only once per
  379.       server config.</p>
  380.  
  381. <note>    To disable the logging of
  382.           rewriting actions it is not recommended to set
  383.           <em>Filename</em> to <code>/dev/null</code>, because
  384.           although the rewriting engine does not then output to a
  385.           logfile it still creates the logfile output internally.
  386.           <strong>This will slow down the server with no advantage
  387.           to the administrator!</strong> To disable logging either
  388.           remove or comment out the <directive>RewriteLog</directive>
  389.           directive or use <code>RewriteLogLevel 0</code>!
  390. </note>
  391.  
  392. <note type="securitywarning"><title>Security</title>
  393.  
  394. See the <a href="../misc/security_tips.html">Apache Security Tips</a>
  395. document for details on why your security could be compromised if the
  396. directory where logfiles are stored is writable by anyone other than
  397. the user that starts the server.
  398. </note>
  399.  
  400. <example><title>Example</title>
  401. RewriteLog "/usr/local/var/apache/logs/rewrite.log"
  402. </example>
  403.  
  404. </usage>
  405.  
  406. </directivesynopsis>
  407.  
  408. <directivesynopsis>
  409. <name>RewriteLogLevel</name>
  410. <description>Sets the verbosity of the log file used by the rewrite
  411. engine</description>
  412. <syntax>RewriteLogLevel <em>Level</em></syntax>
  413. <default>RewriteLogLevel 0</default>
  414. <contextlist><context>server config</context><context>virtual host</context>
  415. </contextlist>
  416.  
  417. <usage>
  418.       <p>The <directive>RewriteLogLevel</directive> directive sets the
  419.       verbosity level of the rewriting logfile. The default level 0
  420.       means no logging, while 9 or more means that practically all
  421.       actions are logged.</p>
  422.  
  423.       <p>To disable the logging of rewriting actions simply set
  424.       <em>Level</em> to 0. This disables all rewrite action
  425.       logs.</p>
  426.  
  427. <note> Using a high value for
  428.           <em>Level</em> will slow down your Apache server
  429.           dramatically! Use the rewriting logfile at a
  430.           <em>Level</em> greater than 2 only for debugging!
  431. </note>
  432.  
  433. <example><title>Example</title>
  434. RewriteLogLevel 3
  435. </example>
  436.  
  437. </usage>
  438.  
  439. </directivesynopsis>
  440.  
  441. <directivesynopsis>
  442. <name>RewriteLock</name>
  443. <description>Sets the name of the lock file used for <directive
  444. module="mod_rewrite">RewriteMap</directive>
  445. synchronization</description>
  446. <syntax>RewriteLock <em>file-path</em></syntax>
  447. <contextlist><context>server config</context></contextlist>
  448.  
  449. <usage>
  450.       <p>This directive sets the filename for a synchronization
  451.       lockfile which mod_rewrite needs to communicate with <directive
  452.       module="mod_rewrite">RewriteMap</directive>
  453.       <em>programs</em>. Set this lockfile to a local path (not on a
  454.       NFS-mounted device) when you want to use a rewriting
  455.       map-program. It is not required for other types of rewriting
  456.       maps.</p>
  457. </usage>
  458.  
  459. </directivesynopsis>
  460.  
  461. <directivesynopsis>
  462. <name>RewriteMap</name>
  463. <description>Defines a mapping function for key-lookup</description>
  464. <syntax>RewriteMap <em>MapName</em> <em>MapType</em>:<em>MapSource</em>
  465. </syntax>
  466. <contextlist><context>server config</context><context>virtual host</context>
  467. </contextlist>
  468. <compatibility>The choice of different dbm types is available in
  469. Apache 2.0.41 and later</compatibility>
  470.  
  471. <usage>
  472.       <p>The <directive>RewriteMap</directive> directive defines a
  473.       <em>Rewriting Map</em> which can be used inside rule
  474.       substitution strings by the mapping-functions to
  475.       insert/substitute fields through a key lookup. The source of
  476.       this lookup can be of various types.</p>
  477.  
  478.       <p>The <a id="mapfunc" name="mapfunc"><em>MapName</em></a> is
  479.       the name of the map and will be used to specify a
  480.       mapping-function for the substitution strings of a rewriting
  481.       rule via one of the following constructs:</p>
  482.  
  483.       <p class="indent">
  484.         <strong><code>${</code> <em>MapName</em> <code>:</code>
  485.         <em>LookupKey</em> <code>}</code><br />
  486.          <code>${</code> <em>MapName</em> <code>:</code>
  487.         <em>LookupKey</em> <code>|</code> <em>DefaultValue</em>
  488.         <code>}</code></strong>
  489.       </p>
  490.  
  491.       <p>When such a construct occurs the map <em>MapName</em> is
  492.       consulted and the key <em>LookupKey</em> is looked-up. If the
  493.       key is found, the map-function construct is substituted by
  494.       <em>SubstValue</em>. If the key is not found then it is
  495.       substituted by <em>DefaultValue</em> or by the empty string
  496.       if no <em>DefaultValue</em> was specified.</p>
  497.  
  498.       <p>The following combinations for <em>MapType</em> and
  499.       <em>MapSource</em> can be used:</p>
  500.  
  501.       <ul>
  502.         <li>
  503.           <strong>Standard Plain Text</strong><br />
  504.            MapType: <code>txt</code>, MapSource: Unix filesystem
  505.           path to valid regular file 
  506.  
  507.           <p>This is the standard rewriting map feature where the
  508.           <em>MapSource</em> is a plain ASCII file containing
  509.           either blank lines, comment lines (starting with a '#'
  510.           character) or pairs like the following - one per
  511.           line.</p>
  512.  
  513.           <p class="indent">
  514.             <strong><em>MatchingKey</em>
  515.             <em>SubstValue</em></strong>
  516.           </p>
  517.  
  518. <example><title>Example</title>
  519. <pre>
  520. ##
  521. ##  map.txt -- rewriting map
  522. ##
  523.  
  524. Ralf.S.Engelschall    rse   # Bastard Operator From Hell
  525. Mr.Joe.Average        joe   # Mr. Average
  526. </pre>
  527. </example>
  528.  
  529. <example>
  530. RewriteMap real-to-user txt:/path/to/file/map.txt
  531. </example>
  532.         </li>
  533.  
  534.         <li>
  535.           <strong>Randomized Plain Text</strong><br />
  536.            MapType: <code>rnd</code>, MapSource: Unix filesystem
  537.           path to valid regular file 
  538.  
  539.           <p>This is identical to the Standard Plain Text variant
  540.           above but with a special post-processing feature: After
  541.           looking up a value it is parsed according to contained
  542.           ``<code>|</code>'' characters which have the meaning of
  543.           ``or''. In other words they indicate a set of
  544.           alternatives from which the actual returned value is
  545.           chosen randomly. Although this sounds crazy and useless,
  546.           it was actually designed for load balancing in a reverse
  547.           proxy situation where the looked up values are server
  548.           names. Example:</p>
  549.  
  550. <example>
  551. <pre>
  552. ##
  553. ##  map.txt -- rewriting map
  554. ##
  555.  
  556. static   www1|www2|www3|www4
  557. dynamic  www5|www6
  558. </pre>
  559. </example>
  560.  
  561. <example>
  562. RewriteMap servers rnd:/path/to/file/map.txt
  563. </example>
  564.         </li>
  565.  
  566.         <li>
  567.           <strong>Hash File</strong><br /> MapType:
  568.           <code>dbm[=<em>type</em>]</code>, MapSource: Unix filesystem
  569.           path to valid regular file
  570.  
  571.           <p>Here the source is a binary format DBM file containing
  572.           the same contents as a <em>Plain Text</em> format file, but
  573.           in a special representation which is optimized for really
  574.           fast lookups. The <em>type</em> can be sdbm, gdbm, ndbm, or
  575.           db depending on <a href="../install.html#dbm">compile-time
  576.           settings</a>.  If the <em>type</em> is ommitted, the
  577.           compile-time default will be chosen. You can create such a
  578.           file with any DBM tool or with the following Perl
  579.           script.  Be sure to adjust it to create the appropriate
  580.           type of DBM.  The example creates an NDBM file.</p>
  581.  
  582. <example>
  583. <pre>
  584. #!/path/to/bin/perl
  585. ##
  586. ##  txt2dbm -- convert txt map to dbm format
  587. ##
  588.  
  589. use NDBM_File;
  590. use Fcntl;
  591.  
  592. ($txtmap, $dbmmap) = @ARGV;
  593.  
  594. open(TXT, "<$txtmap") or die "Couldn't open $txtmap!\n";
  595. tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
  596.   or die "Couldn't create $dbmmap!\n";
  597.  
  598. while (<TXT>) {
  599.   next if (/^\s*#/ or /^\s*$/);
  600.   $DB{$1} = $2 if (/^\s*(\S+)\s+(\S+)/);
  601. }
  602.  
  603. untie %DB;
  604. close(TXT);
  605. </pre>
  606. </example>
  607.  
  608. <example>
  609. $ txt2dbm map.txt map.db
  610. </example>
  611.         </li>
  612.  
  613.         <li>
  614.           <strong>Internal Function</strong><br />
  615.            MapType: <code>int</code>, MapSource: Internal Apache
  616.           function 
  617.  
  618.           <p>Here the source is an internal Apache function.
  619.           Currently you cannot create your own, but the following
  620.           functions already exists:</p>
  621.  
  622.           <ul>
  623.             <li><strong>toupper</strong>:<br />
  624.              Converts the looked up key to all upper case.</li>
  625.  
  626.             <li><strong>tolower</strong>:<br />
  627.              Converts the looked up key to all lower case.</li>
  628.  
  629.             <li><strong>escape</strong>:<br />
  630.              Translates special characters in the looked up key to
  631.             hex-encodings.</li>
  632.  
  633.             <li><strong>unescape</strong>:<br />
  634.              Translates hex-encodings in the looked up key back to
  635.             special characters.</li>
  636.           </ul>
  637.         </li>
  638.  
  639.         <li>
  640.           <strong>External Rewriting Program</strong><br />
  641.            MapType: <code>prg</code>, MapSource: Unix filesystem
  642.           path to valid regular file 
  643.  
  644.           <p>Here the source is a program, not a map file. To
  645.           create it you can use the language of your choice, but
  646.           the result has to be a executable (<em>i.e.</em>, either
  647.           object-code or a script with the magic cookie trick
  648.           '<code>#!/path/to/interpreter</code>' as the first
  649.           line).</p>
  650.  
  651.           <p>This program is started once at startup of the Apache
  652.           servers and then communicates with the rewriting engine
  653.           over its <code>stdin</code> and <code>stdout</code>
  654.           file-handles. For each map-function lookup it will
  655.           receive the key to lookup as a newline-terminated string
  656.           on <code>stdin</code>. It then has to give back the
  657.           looked-up value as a newline-terminated string on
  658.           <code>stdout</code> or the four-character string
  659.           ``<code>NULL</code>'' if it fails (<em>i.e.</em>, there
  660.           is no corresponding value for the given key). A trivial
  661.           program which will implement a 1:1 map (<em>i.e.</em>,
  662.           key == value) could be:</p>
  663.  
  664. <example>
  665. <pre>
  666. #!/usr/bin/perl
  667. $| = 1;
  668. while (<STDIN>) {
  669.     # ...put here any transformations or lookups...
  670.     print $_;
  671. }
  672. </pre>
  673. </example>
  674.  
  675.           <p>But be very careful:</p>
  676.  
  677.           <ol>
  678.             <li>``<em>Keep it simple, stupid</em>'' (KISS), because
  679.             if this program hangs it will hang the Apache server
  680.             when the rule occurs.</li>
  681.  
  682.             <li>Avoid one common mistake: never do buffered I/O on
  683.             <code>stdout</code>! This will cause a deadloop! Hence
  684.             the ``<code>$|=1</code>'' in the above example...</li>
  685.  
  686.             <li>Use the <directive
  687.             module="mod_rewrite">RewriteLock</directive> directive to
  688.             define a lockfile mod_rewrite can use to synchronize the
  689.             communication to the program. By default no such
  690.             synchronization takes place.</li>
  691.           </ol>
  692.         </li>
  693.       </ul>
  694.       <p>The <directive>RewriteMap</directive> directive can occur more than
  695.       once. For each mapping-function use one
  696.       <directive>RewriteMap</directive> directive to declare its rewriting
  697.       mapfile. While you cannot <strong>declare</strong> a map in
  698.       per-directory context it is of course possible to
  699.       <strong>use</strong> this map in per-directory context. </p>
  700.  
  701. <note><title>Note</title> For plain text and DBM format files the
  702. looked-up keys are cached in-core until the <code>mtime</code> of the
  703. mapfile changes or the server does a restart. This way you can have
  704. map-functions in rules which are used for <strong>every</strong>
  705. request.  This is no problem, because the external lookup only happens
  706. once!
  707. </note>
  708.  
  709. </usage>
  710. </directivesynopsis>
  711.  
  712. <directivesynopsis>
  713. <name>RewriteBase</name>
  714. <description>Sets the base URL for per-directory rewrites</description>
  715. <syntax>RewriteBase <em>URL-path</em></syntax>
  716. <default>See usage for information.</default>
  717. <contextlist><context>directory</context><context>.htaccess</context>
  718. </contextlist>
  719. <override>FileInfo</override>
  720.  
  721. <usage>
  722.       <p>The <directive>RewriteBase</directive> directive explicitly
  723.       sets the base URL for per-directory rewrites. As you will see
  724.       below, <directive module="mod_rewrite">RewriteRule</directive>
  725.       can be used in per-directory config files
  726.       (<code>.htaccess</code>). There it will act locally,
  727.       <em>i.e.</em>, the local directory prefix is stripped at this
  728.       stage of processing and your rewriting rules act only on the
  729.       remainder. At the end it is automatically added back to the
  730.       path. The default setting is; <directive>RewriteBase</directive> <em>physical-directory-path</em></p>
  731.  
  732.       <p>When a substitution occurs for a new URL, this module has
  733.       to re-inject the URL into the server processing. To be able
  734.       to do this it needs to know what the corresponding URL-prefix
  735.       or URL-base is. By default this prefix is the corresponding
  736.       filepath itself. <strong>But at most websites URLs are NOT
  737.       directly related to physical filename paths, so this
  738.       assumption will usually be wrong!</strong> There you have to
  739.       use the <code>RewriteBase</code> directive to specify the
  740.       correct URL-prefix.</p>
  741.  
  742. <note> If your webserver's URLs are <strong>not</strong> directly
  743. related to physical file paths, you have to use
  744. <directive>RewriteBase</directive> in every <code>.htaccess</code>
  745. files where you want to use <directive
  746. module="mod_rewrite">RewriteRule</directive> directives.
  747. </note>
  748.  
  749.         <p> For example, assume the following per-directory config file:</p>
  750.  
  751. <example>
  752. <pre>
  753. #
  754. #  /abc/def/.htaccess -- per-dir config file for directory /abc/def
  755. #  Remember: /abc/def is the physical path of /xyz, <em>i.e.</em>, the server
  756. #            has a 'Alias /xyz /abc/def' directive <em>e.g.</em>
  757. #
  758.  
  759. RewriteEngine On
  760.  
  761. #  let the server know that we were reached via /xyz and not
  762. #  via the physical path prefix /abc/def
  763. RewriteBase   /xyz
  764.  
  765. #  now the rewriting rules
  766. RewriteRule   ^oldstuff\.html$  newstuff.html
  767. </pre>
  768. </example>
  769.  
  770.         <p>In the above example, a request to
  771.         <code>/xyz/oldstuff.html</code> gets correctly rewritten to
  772.         the physical file <code>/abc/def/newstuff.html</code>.</p>
  773.  
  774. <note><title>For Apache Hackers</title>
  775. <p>The following list gives detailed information about
  776.               the internal processing steps:</p>
  777. <pre>
  778. Request:
  779.   /xyz/oldstuff.html
  780.  
  781. Internal Processing:
  782.   /xyz/oldstuff.html     -> /abc/def/oldstuff.html  (per-server Alias)
  783.   /abc/def/oldstuff.html -> /abc/def/newstuff.html  (per-dir    RewriteRule)
  784.   /abc/def/newstuff.html -> /xyz/newstuff.html      (per-dir    RewriteBase)
  785.   /xyz/newstuff.html     -> /abc/def/newstuff.html  (per-server Alias)
  786.  
  787. Result:
  788.   /abc/def/newstuff.html
  789. </pre>
  790.               <p>This seems very complicated but is
  791.               the correct Apache internal processing, because the
  792.               per-directory rewriting comes too late in the
  793.               process. So, when it occurs the (rewritten) request
  794.               has to be re-injected into the Apache kernel! BUT:
  795.               While this seems like a serious overhead, it really
  796.               isn't, because this re-injection happens fully
  797.               internally to the Apache server and the same
  798.               procedure is used by many other operations inside
  799.               Apache. So, you can be sure the design and
  800.               implementation is correct.</p>
  801. </note>
  802.  
  803. </usage>
  804.  
  805. </directivesynopsis>
  806.  
  807. <directivesynopsis>
  808. <name>RewriteCond</name>
  809. <description>Defines a condition under which rewriting will take place
  810. </description>
  811. <syntax> RewriteCond
  812.       <em>TestString</em> <em>CondPattern</em></syntax>
  813. <contextlist><context>server config</context><context>virtual host</context>
  814. <context>directory</context><context>.htaccess</context></contextlist>
  815. <override>FileInfo</override>
  816.  
  817. <usage>
  818.       <p>The <directive>RewriteCond</directive> directive defines a
  819.       rule condition. Precede a <directive
  820.       module="mod_rewrite">RewriteRule</directive> directive with one
  821.       or more <directive>RewriteCond</directive> directives. The following
  822.       rewriting rule is only used if its pattern matches the current
  823.       state of the URI <strong>and</strong> if these additional
  824.       conditions apply too.</p>
  825.  
  826.       <p><em>TestString</em> is a string which can contains the
  827.       following expanded constructs in addition to plain text:</p>
  828.  
  829.       <ul>
  830.         <li>
  831.           <strong>RewriteRule backreferences</strong>: These are
  832.           backreferences of the form 
  833.  
  834.           <p class="indent">
  835.             <strong><code>$N</code></strong>
  836.           </p>
  837.           (0 <= N <= 9) which provide access to the grouped
  838.           parts (parenthesis!) of the pattern from the
  839.           corresponding <code>RewriteRule</code> directive (the one
  840.           following the current bunch of <code>RewriteCond</code>
  841.           directives).
  842.         </li>
  843.  
  844.         <li>
  845.           <strong>RewriteCond backreferences</strong>: These are
  846.           backreferences of the form 
  847.  
  848.           <p class="indent">
  849.             <strong><code>%N</code></strong>
  850.           </p>
  851.           (1 <= N <= 9) which provide access to the grouped
  852.           parts (parentheses!) of the pattern from the last matched
  853.           <code>RewriteCond</code> directive in the current bunch
  854.           of conditions.
  855.         </li>
  856.  
  857.         <li>
  858.           <strong>RewriteMap expansions</strong>: These are
  859.           expansions of the form 
  860.  
  861.           <p class="indent">
  862.             <strong><code>${mapname:key|default}</code></strong>
  863.           </p>
  864.           See <a href="#mapfunc">the documentation for
  865.           RewriteMap</a> for more details.
  866.         </li>
  867.  
  868.         <li>
  869.           <strong>Server-Variables</strong>: These are variables of
  870.           the form 
  871.  
  872.           <p class="indent">
  873.             <strong><code>%{</code> <em>NAME_OF_VARIABLE</em>
  874.             <code>}</code></strong>
  875.           </p>
  876.           where <em>NAME_OF_VARIABLE</em> can be a string taken
  877.           from the following list: 
  878.  
  879.           <table>
  880.           <columnspec><column width=".3"/><column width=".3"/>
  881.            <column width=".3"/></columnspec>
  882.             <tr>
  883.               <th>HTTP headers:</th> <th>connection & request:</th> <th></th>
  884.         </tr>
  885.  
  886.             <tr>
  887.           <td>
  888.          HTTP_USER_AGENT<br />
  889.                  HTTP_REFERER<br />
  890.                  HTTP_COOKIE<br />
  891.                  HTTP_FORWARDED<br />
  892.                  HTTP_HOST<br />
  893.                  HTTP_PROXY_CONNECTION<br />
  894.                  HTTP_ACCEPT<br />
  895.               </td>
  896.  
  897.               <td>
  898.                  REMOTE_ADDR<br />
  899.                  REMOTE_HOST<br />
  900.                  REMOTE_USER<br />
  901.                  REMOTE_IDENT<br />
  902.                  REQUEST_METHOD<br />
  903.                  SCRIPT_FILENAME<br />
  904.                  PATH_INFO<br />
  905.                  QUERY_STRING<br />
  906.                  AUTH_TYPE<br />
  907.               </td>
  908.           
  909.           <td></td>
  910.             </tr>
  911.  
  912.             <tr>
  913.               <th>server internals:</th> <th>system stuff:</th> <th>specials:</th>
  914.         </tr>
  915.  
  916.             <tr>
  917.           <td>
  918.              DOCUMENT_ROOT<br />
  919.                  SERVER_ADMIN<br />
  920.                  SERVER_NAME<br />
  921.                  SERVER_ADDR<br />
  922.                  SERVER_PORT<br />
  923.                  SERVER_PROTOCOL<br />
  924.                  SERVER_SOFTWARE<br />
  925.               </td>
  926.  
  927.               <td>
  928.                  TIME_YEAR<br />
  929.                  TIME_MON<br />
  930.                  TIME_DAY<br />
  931.                  TIME_HOUR<br />
  932.                  TIME_MIN<br />
  933.                  TIME_SEC<br />
  934.                  TIME_WDAY<br />
  935.                  TIME<br />
  936.               </td>
  937.  
  938.               <td>
  939.                  API_VERSION<br />
  940.                  THE_REQUEST<br />
  941.                  REQUEST_URI<br />
  942.                  REQUEST_FILENAME<br />
  943.                  IS_SUBREQ<br />
  944.                  HTTPS<br />
  945.               </td>
  946.             </tr>
  947.           </table>
  948.  
  949. <note>
  950.                 <p>These variables all
  951.                 correspond to the similarly named HTTP
  952.                 MIME-headers, C variables of the Apache server or
  953.                 <code>struct tm</code> fields of the Unix system.
  954.                 Most are documented elsewhere in the Manual or in
  955.                 the CGI specification. Those that are special to
  956.                 mod_rewrite include:</p>
  957.  
  958.                 <dl>
  959.                   <dt><code>IS_SUBREQ</code></dt>
  960.  
  961.                   <dd>Will contain the text "true" if the request
  962.                   currently being processed is a sub-request,
  963.                   "false" otherwise. Sub-requests may be generated
  964.                   by modules that need to resolve additional files
  965.                   or URIs in order to complete their tasks.</dd>
  966.  
  967.                   <dt><code>API_VERSION</code></dt>
  968.  
  969.                   <dd>This is the version of the Apache module API
  970.                   (the internal interface between server and
  971.                   module) in the current httpd build, as defined in
  972.                   include/ap_mmn.h. The module API version
  973.                   corresponds to the version of Apache in use (in
  974.                   the release version of Apache 1.3.14, for
  975.                   instance, it is 19990320:10), but is mainly of
  976.                   interest to module authors.</dd>
  977.  
  978.                   <dt><code>THE_REQUEST</code></dt>
  979.  
  980.                   <dd>The full HTTP request line sent by the
  981.                   browser to the server (e.g., "<code>GET
  982.                   /index.html HTTP/1.1</code>"). This does not
  983.                   include any additional headers sent by the
  984.                   browser.</dd>
  985.  
  986.                   <dt><code>REQUEST_URI</code></dt>
  987.  
  988.                   <dd>The resource requested in the HTTP request
  989.                   line. (In the example above, this would be
  990.                   "/index.html".)</dd>
  991.  
  992.                   <dt><code>REQUEST_FILENAME</code></dt>
  993.  
  994.                   <dd>The full local filesystem path to the file or
  995.                   script matching the request.</dd>
  996.  
  997.                   <dt><code>HTTPS</code></dt>
  998.  
  999.                   <dd>Will contain the text "on" if the connection is
  1000.                   using SSL/TLS, or "off" otherwise.  (This variable
  1001.                   can be safely used regardless of whether
  1002.                   <module>mod_ssl</module> is loaded).</dd>
  1003.  
  1004.                 </dl>
  1005. </note>
  1006.         </li>
  1007.       </ul>
  1008.  
  1009.       <p>Special Notes:</p>
  1010.  
  1011.       <ol>
  1012.         <li>The variables SCRIPT_FILENAME and REQUEST_FILENAME
  1013.         contain the same value, <em>i.e.</em>, the value of the
  1014.         <code>filename</code> field of the internal
  1015.         <code>request_rec</code> structure of the Apache server.
  1016.         The first name is just the commonly known CGI variable name
  1017.         while the second is the consistent counterpart to
  1018.         REQUEST_URI (which contains the value of the
  1019.         <code>uri</code> field of <code>request_rec</code>).</li>
  1020.  
  1021.         <li>There is the special format:
  1022.         <code>%{ENV:variable}</code> where <em>variable</em> can be
  1023.         any environment variable. This is looked-up via internal
  1024.         Apache structures and (if not found there) via
  1025.         <code>getenv()</code> from the Apache server process.</li>
  1026.  
  1027.         <li>There is the special format: 
  1028.         <code>%{SSL:variable}</code> where <em>variable</em> is the
  1029.         name of an <a href="mod_ssl.html#envvars">SSL environment
  1030.         variable</a>; this can be used whether or not
  1031.         <module>mod_ssl</module> is loaded, but will always expand to
  1032.         the empty string if it is not.  Example:
  1033.         <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to
  1034.         <code>128</code>.</li>
  1035.  
  1036.         <li>There is the special format:
  1037.         <code>%{HTTP:header}</code> where <em>header</em> can be
  1038.         any HTTP MIME-header name. This is looked-up from the HTTP
  1039.         request. Example: <code>%{HTTP:Proxy-Connection}</code> is
  1040.         the value of the HTTP header
  1041.         ``<code>Proxy-Connection:</code>''.</li>
  1042.  
  1043.         <li>There is the special format
  1044.         <code>%{LA-U:variable}</code> for look-aheads which perform
  1045.         an internal (URL-based) sub-request to determine the final
  1046.         value of <em>variable</em>. Use this when you want to use a
  1047.         variable for rewriting which is actually set later in an
  1048.         API phase and thus is not available at the current stage.
  1049.         For instance when you want to rewrite according to the
  1050.         <code>REMOTE_USER</code> variable from within the
  1051.         per-server context (<code>httpd.conf</code> file) you have
  1052.         to use <code>%{LA-U:REMOTE_USER}</code> because this
  1053.         variable is set by the authorization phases which come
  1054.         <em>after</em> the URL translation phase where mod_rewrite
  1055.         operates. On the other hand, because mod_rewrite implements
  1056.         its per-directory context (<code>.htaccess</code> file) via
  1057.         the Fixup phase of the API and because the authorization
  1058.         phases come <em>before</em> this phase, you just can use
  1059.         <code>%{REMOTE_USER}</code> there.</li>
  1060.  
  1061.         <li>There is the special format:
  1062.         <code>%{LA-F:variable}</code> which performs an internal
  1063.         (filename-based) sub-request to determine the final value
  1064.         of <em>variable</em>. Most of the time this is the same as
  1065.         LA-U above.</li>
  1066.       </ol>
  1067.  
  1068.       <p><em>CondPattern</em> is the condition pattern,
  1069.       <em>i.e.</em>, a regular expression which is applied to the
  1070.       current instance of the <em>TestString</em>, <em>i.e.</em>,
  1071.       <em>TestString</em> is evaluated and then matched against
  1072.       <em>CondPattern</em>.</p>
  1073.  
  1074.       <p><strong>Remember:</strong> <em>CondPattern</em> is a
  1075.       <em>perl compatible regular expression</em> with some
  1076.       additions:</p>
  1077.  
  1078.       <ol>
  1079.         <li>You can prefix the pattern string with a
  1080.         '<code>!</code>' character (exclamation mark) to specify a
  1081.         <strong>non</strong>-matching pattern.</li>
  1082.  
  1083.         <li>
  1084.           There are some special variants of <em>CondPatterns</em>.
  1085.           Instead of real regular expression strings you can also
  1086.           use one of the following: 
  1087.  
  1088.           <ul>
  1089.             <li>'<strong><CondPattern</strong>' (is lexically
  1090.             lower)<br />
  1091.              Treats the <em>CondPattern</em> as a plain string and
  1092.             compares it lexically to <em>TestString</em>. True if
  1093.             <em>TestString</em> is lexically lower than
  1094.             <em>CondPattern</em>.</li>
  1095.  
  1096.             <li>'<strong>>CondPattern</strong>' (is lexically
  1097.             greater)<br />
  1098.              Treats the <em>CondPattern</em> as a plain string and
  1099.             compares it lexically to <em>TestString</em>. True if
  1100.             <em>TestString</em> is lexically greater than
  1101.             <em>CondPattern</em>.</li>
  1102.  
  1103.             <li>'<strong>=CondPattern</strong>' (is lexically
  1104.             equal)<br />
  1105.              Treats the <em>CondPattern</em> as a plain string and
  1106.             compares it lexically to <em>TestString</em>. True if
  1107.             <em>TestString</em> is lexically equal to
  1108.             <em>CondPattern</em>, i.e the two strings are exactly
  1109.             equal (character by character). If <em>CondPattern</em>
  1110.             is just <code>""</code> (two quotation marks) this
  1111.             compares <em>TestString</em> to the empty string.</li>
  1112.  
  1113.             <li>'<strong>-d</strong>' (is
  1114.             <strong>d</strong>irectory)<br />
  1115.              Treats the <em>TestString</em> as a pathname and tests
  1116.             if it exists and is a directory.</li>
  1117.  
  1118.             <li>'<strong>-f</strong>' (is regular
  1119.             <strong>f</strong>ile)<br />
  1120.              Treats the <em>TestString</em> as a pathname and tests
  1121.             if it exists and is a regular file.</li>
  1122.  
  1123.             <li>'<strong>-s</strong>' (is regular file with
  1124.             <strong>s</strong>ize)<br />
  1125.              Treats the <em>TestString</em> as a pathname and tests
  1126.             if it exists and is a regular file with size greater
  1127.             than zero.</li>
  1128.  
  1129.             <li>'<strong>-l</strong>' (is symbolic
  1130.             <strong>l</strong>ink)<br />
  1131.              Treats the <em>TestString</em> as a pathname and tests
  1132.             if it exists and is a symbolic link.</li>
  1133.  
  1134.             <li>'<strong>-F</strong>' (is existing file via
  1135.             subrequest)<br />
  1136.              Checks if <em>TestString</em> is a valid file and
  1137.             accessible via all the server's currently-configured
  1138.             access controls for that path. This uses an internal
  1139.             subrequest to determine the check, so use it with care
  1140.             because it decreases your servers performance!</li>
  1141.  
  1142.             <li>'<strong>-U</strong>' (is existing URL via
  1143.             subrequest)<br />
  1144.              Checks if <em>TestString</em> is a valid URL and
  1145.             accessible via all the server's currently-configured
  1146.             access controls for that path. This uses an internal
  1147.             subrequest to determine the check, so use it with care
  1148.             because it decreases your server's performance!</li>
  1149.           </ul>
  1150.  
  1151. <note><title>Notice</title>
  1152.               All of these tests can
  1153.               also be prefixed by an exclamation mark ('!') to
  1154.               negate their meaning.
  1155. </note>
  1156.         </li>
  1157.       </ol>
  1158.  
  1159.       <p>Additionally you can set special flags for
  1160.       <em>CondPattern</em> by appending</p>
  1161.  
  1162.       <p class="indent">
  1163.         <strong><code>[</code><em>flags</em><code>]</code></strong>
  1164.       </p>
  1165.  
  1166.       <p>as the third argument to the <code>RewriteCond</code>
  1167.       directive. <em>Flags</em> is a comma-separated list of the
  1168.       following flags:</p>
  1169.  
  1170.       <ul>
  1171.         <li>'<strong><code>nocase|NC</code></strong>'
  1172.         (<strong>n</strong>o <strong>c</strong>ase)<br />
  1173.          This makes the test case-insensitive, <em>i.e.</em>, there
  1174.         is no difference between 'A-Z' and 'a-z' both in the
  1175.         expanded <em>TestString</em> and the <em>CondPattern</em>.
  1176.         This flag is effective only for comparisons between
  1177.         <em>TestString</em> and <em>CondPattern</em>. It has no
  1178.         effect on filesystem and subrequest checks.</li>
  1179.  
  1180.         <li>
  1181.           '<strong><code>ornext|OR</code></strong>'
  1182.           (<strong>or</strong> next condition)<br />
  1183.            Use this to combine rule conditions with a local OR
  1184.           instead of the implicit AND. Typical example: 
  1185.  
  1186. <example>
  1187. <pre>
  1188. RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
  1189. RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
  1190. RewriteCond %{REMOTE_HOST}  ^host3.*
  1191. RewriteRule ...some special stuff for any of these hosts...
  1192. </pre>
  1193. </example>
  1194.  
  1195.           Without this flag you would have to write the cond/rule
  1196.           three times.
  1197.         </li>
  1198.       </ul>
  1199.  
  1200.       <p><strong>Example:</strong></p>
  1201.  
  1202.        <p>To rewrite the Homepage of a site according to the
  1203.         ``<code>User-Agent:</code>'' header of the request, you can
  1204.         use the following: </p>
  1205.  
  1206. <example>
  1207. <pre>
  1208. RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
  1209. RewriteRule  ^/$                 /homepage.max.html  [L]
  1210.  
  1211. RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
  1212. RewriteRule  ^/$                 /homepage.min.html  [L]
  1213.  
  1214. RewriteRule  ^/$                 /homepage.std.html  [L]
  1215. </pre>
  1216. </example>
  1217.  
  1218.         <p>Interpretation: If you use Netscape Navigator as your
  1219.         browser (which identifies itself as 'Mozilla'), then you
  1220.         get the max homepage, which includes Frames, <em>etc.</em>
  1221.         If you use the Lynx browser (which is Terminal-based), then
  1222.         you get the min homepage, which contains no images, no
  1223.         tables, <em>etc.</em> If you use any other browser you get
  1224.         the standard homepage.</p>
  1225.  
  1226. </usage>
  1227.  
  1228. </directivesynopsis>
  1229.  
  1230. <directivesynopsis>
  1231. <name>RewriteRule</name>
  1232. <description>Defines rules for the rewriting engine</description>
  1233. <syntax>RewriteRule
  1234.       <em>Pattern</em> <em>Substitution</em></syntax>
  1235. <contextlist><context>server config</context><context>virtual host</context>
  1236. <context>directory</context><context>.htaccess</context></contextlist>
  1237. <override>FileInfo</override>
  1238. <compatibility>The cookie-flag is available in Apache 2.0.40 and later.</compatibility>
  1239.  
  1240. <usage>
  1241.       <p>The <directive>RewriteRule</directive> directive is the real
  1242.       rewriting workhorse. The directive can occur more than once.
  1243.       Each directive then defines one single rewriting rule. The
  1244.       <strong>definition order</strong> of these rules is
  1245.       <strong>important</strong>, because this order is used when
  1246.       applying the rules at run-time.</p>
  1247.  
  1248.       <p><a id="patterns" name="patterns"><em>Pattern</em></a> is
  1249.       a perl compatible <a id="regexp" name="regexp">regular
  1250.       expression</a> which gets applied to the current URL. Here
  1251.       ``current'' means the value of the URL when this rule gets
  1252.       applied. This may not be the originally requested URL,
  1253.       because any number of rules may already have matched and made
  1254.       alterations to it.</p>
  1255.  
  1256.       <p>Some hints about the syntax of regular expressions:</p>
  1257.  
  1258. <note><pre>
  1259. <strong>Text:</strong>
  1260.   <strong><code>.</code></strong>           Any single character
  1261.   <strong><code>[</code></strong>chars<strong><code>]</code></strong>     Character class: One  of chars
  1262.   <strong><code>[^</code></strong>chars<strong><code>]</code></strong>    Character class: None of chars
  1263.   text1<strong><code>|</code></strong>text2 Alternative: text1 or text2
  1264.  
  1265. <strong>Quantifiers:</strong>
  1266.   <strong><code>?</code></strong>           0 or 1 of the preceding text
  1267.   <strong><code>*</code></strong>           0 or N of the preceding text (N > 0)
  1268.   <strong><code>+</code></strong>           1 or N of the preceding text (N > 1)
  1269.  
  1270. <strong>Grouping:</strong>
  1271.   <strong><code>(</code></strong>text<strong><code>)</code></strong>      Grouping of text
  1272.               (either to set the borders of an alternative or
  1273.               for making backreferences where the <strong>N</strong>th group can 
  1274.               be used on the RHS of a RewriteRule with <code>$</code><strong>N</strong>)
  1275.  
  1276. <strong>Anchors:</strong>
  1277.   <strong><code>^</code></strong>           Start of line anchor
  1278.   <strong><code>$</code></strong>           End   of line anchor
  1279.  
  1280. <strong>Escaping:</strong>
  1281.   <strong><code>\</code></strong>char       escape that particular char
  1282.               (for instance to specify the chars "<code>.[]()</code>" <em>etc.</em>)
  1283. </pre></note>
  1284.  
  1285.       <p>For more information about regular expressions have a look at the
  1286.       perl regular expression manpage ("<a
  1287.       href="http://www.perldoc.com/perl5.6.1/pod/perlre.html">perldoc
  1288.       perlre</a>"). If you are interested in more detailed
  1289.       information about regular expressions and their variants
  1290.       (POSIX regex <em>etc.</em>) have a look at the
  1291.       following dedicated book on this topic:</p>
  1292.  
  1293.       <p class="indent">
  1294.         <em>Mastering Regular Expressions</em><br />
  1295.          Jeffrey E.F. Friedl<br />
  1296.          Nutshell Handbook Series<br />
  1297.          O'Reilly & Associates, Inc. 1997<br />
  1298.          ISBN 1-56592-257-3<br />
  1299.       </p>
  1300.  
  1301.       <p>Additionally in mod_rewrite the NOT character
  1302.       ('<code>!</code>') is a possible pattern prefix. This gives
  1303.       you the ability to negate a pattern; to say, for instance:
  1304.       ``<em>if the current URL does <strong>NOT</strong> match this
  1305.       pattern</em>''. This can be used for exceptional cases, where
  1306.       it is easier to match the negative pattern, or as a last
  1307.       default rule.</p>
  1308.  
  1309. <note><title>Notice</title>
  1310. When using the NOT character
  1311.           to negate a pattern you cannot have grouped wildcard
  1312.           parts in the pattern. This is impossible because when the
  1313.           pattern does NOT match, there are no contents for the
  1314.           groups. In consequence, if negated patterns are used, you
  1315.           cannot use <code>$N</code> in the substitution
  1316.           string!
  1317. </note>
  1318.  
  1319.       <p><a id="rhs" name="rhs"><em>Substitution</em></a> of a
  1320.       rewriting rule is the string which is substituted for (or
  1321.       replaces) the original URL for which <em>Pattern</em>
  1322.       matched. Beside plain text you can use</p>
  1323.  
  1324.       <ol>
  1325.         <li>back-references <code>$N</code> to the RewriteRule
  1326.         pattern</li>
  1327.  
  1328.         <li>back-references <code>%N</code> to the last matched
  1329.         RewriteCond pattern</li>
  1330.  
  1331.         <li>server-variables as in rule condition test-strings
  1332.         (<code>%{VARNAME}</code>)</li>
  1333.  
  1334.         <li><a href="#mapfunc">mapping-function</a> calls
  1335.         (<code>${mapname:key|default}</code>)</li>
  1336.       </ol>
  1337.       <p>Back-references are <code>$</code><strong>N</strong>
  1338.       (<strong>N</strong>=0..9) identifiers which will be replaced
  1339.       by the contents of the <strong>N</strong>th group of the
  1340.       matched <em>Pattern</em>. The server-variables are the same
  1341.       as for the <em>TestString</em> of a <code>RewriteCond</code>
  1342.       directive. The mapping-functions come from the
  1343.       <code>RewriteMap</code> directive and are explained there.
  1344.       These three types of variables are expanded in the order of
  1345.       the above list. </p>
  1346.  
  1347.       <p>As already mentioned above, all the rewriting rules are
  1348.       applied to the <em>Substitution</em> (in the order of
  1349.       definition in the config file). The URL is <strong>completely
  1350.       replaced</strong> by the <em>Substitution</em> and the
  1351.       rewriting process goes on until there are no more rules
  1352.       unless explicitly terminated by a
  1353.       <code><strong>L</strong></code> flag - see below.</p>
  1354.  
  1355.       <p>There is a special substitution string named
  1356.       '<code>-</code>' which means: <strong>NO
  1357.       substitution</strong>! Sounds silly? No, it is useful to
  1358.       provide rewriting rules which <strong>only</strong> match
  1359.       some URLs but do no substitution, <em>e.g.</em>, in
  1360.       conjunction with the <strong>C</strong> (chain) flag to be
  1361.       able to have more than one pattern to be applied before a
  1362.       substitution occurs.</p>
  1363.  
  1364. <note><title>Query String</title>
  1365.       <p>The <em>Pattern</em> will not match against the query string.
  1366.       Instead, you must use a <directive
  1367.       module="mod_rewrite">RewriteCond</directive> with the
  1368.       <code>%{QUERY_STRING}</code> variable.  You can, however, create
  1369.       URLs in the substitution string containing a query string
  1370.       part. Just use a question mark inside the substitution string to
  1371.       indicate that the following stuff should be re-injected into the
  1372.       query string. When you want to erase an existing query string,
  1373.       end the substitution string with just the question mark.  To
  1374.       combine a new query string with an old one, use the
  1375.       <code>[QSA]</code> flag (see below).</p>
  1376. </note>
  1377.  
  1378. <note><title>Substitution of Absolute URLs</title>
  1379.           <p>There is a special feature:
  1380.           When you prefix a substitution field with
  1381.           <code>http://</code><em>thishost</em>[<em>:thisport</em>]
  1382.           then <strong>mod_rewrite</strong> automatically strips it
  1383.           out. This auto-reduction on implicit external redirect
  1384.           URLs is a useful and important feature when used in
  1385.           combination with a mapping-function which generates the
  1386.           hostname part. Have a look at the first example in the
  1387.           example section below to understand this.</p>
  1388.  
  1389.           <p><strong>Remember:</strong> An unconditional external
  1390.           redirect to your own server will not work with the prefix
  1391.           <code>http://thishost</code> because of this feature. To
  1392.           achieve such a self-redirect, you have to use the
  1393.           <strong>R</strong>-flag (see below).</p>
  1394. </note>
  1395.  
  1396.       <p>Additionally you can set special flags for
  1397.       <em>Substitution</em> by appending</p>
  1398.  
  1399.       <p class="indent">
  1400.         <strong><code>[</code><em>flags</em><code>]</code></strong>
  1401.       </p>
  1402.       <p>
  1403.       as the third argument to the <code>RewriteRule</code>
  1404.       directive. <em>Flags</em> is a comma-separated list of the
  1405.       following flags: </p>
  1406.  
  1407.       <ul>
  1408.         <li>
  1409.           '<strong><code>redirect|R</code>
  1410.           [=<em>code</em>]</strong>' (force <a id="redirect"
  1411.           name="redirect"><strong>r</strong>edirect</a>)<br />
  1412.            Prefix <em>Substitution</em> with
  1413.           <code>http://thishost[:thisport]/</code> (which makes the
  1414.           new URL a URI) to force a external redirection. If no
  1415.           <em>code</em> is given a HTTP response of 302 (MOVED
  1416.           TEMPORARILY) is used. If you want to use other response
  1417.           codes in the range 300-400 just specify them as a number
  1418.           or use one of the following symbolic names:
  1419.           <code>temp</code> (default), <code>permanent</code>,
  1420.           <code>seeother</code>. Use it for rules which should
  1421.           canonicalize the URL and give it back to the client,
  1422.           <em>e.g.</em>, translate ``<code>/~</code>'' into
  1423.           ``<code>/u/</code>'' or always append a slash to
  1424.           <code>/u/</code><em>user</em>, etc.<br />
  1425.            
  1426.  
  1427.           <p><strong>Note:</strong> When you use this flag, make
  1428.           sure that the substitution field is a valid URL! If not,
  1429.           you are redirecting to an invalid location! And remember
  1430.           that this flag itself only prefixes the URL with
  1431.           <code>http://thishost[:thisport]/</code>, rewriting
  1432.           continues. Usually you also want to stop and do the
  1433.           redirection immediately. To stop the rewriting you also
  1434.           have to provide the 'L' flag.</p>
  1435.         </li>
  1436.  
  1437.         <li>'<strong><code>forbidden|F</code></strong>' (force URL
  1438.         to be <strong>f</strong>orbidden)<br />
  1439.          This forces the current URL to be forbidden,
  1440.         <em>i.e.</em>, it immediately sends back a HTTP response of
  1441.         403 (FORBIDDEN). Use this flag in conjunction with
  1442.         appropriate RewriteConds to conditionally block some
  1443.         URLs.</li>
  1444.  
  1445.         <li>'<strong><code>gone|G</code></strong>' (force URL to be
  1446.         <strong>g</strong>one)<br />
  1447.          This forces the current URL to be gone, <em>i.e.</em>, it
  1448.         immediately sends back a HTTP response of 410 (GONE). Use
  1449.         this flag to mark pages which no longer exist as gone.</li>
  1450.  
  1451.         <li>
  1452.           '<strong><code>proxy|P</code></strong>' (force
  1453.           <strong>p</strong>roxy)<br />
  1454.            This flag forces the substitution part to be internally
  1455.           forced as a proxy request and immediately (<em>i.e.</em>,
  1456.           rewriting rule processing stops here) put through the <a
  1457.           href="mod_proxy.html">proxy module</a>. You have to make
  1458.           sure that the substitution string is a valid URI
  1459.           (<em>e.g.</em>, typically starting with
  1460.           <code>http://</code><em>hostname</em>) which can be
  1461.           handled by the Apache proxy module. If not you get an
  1462.           error from the proxy module. Use this flag to achieve a
  1463.           more powerful implementation of the <a
  1464.           href="mod_proxy.html#proxypass">ProxyPass</a> directive,
  1465.           to map some remote stuff into the namespace of the local
  1466.           server. 
  1467.  
  1468.           <p>Notice: To use this functionality make sure you have
  1469.           the proxy module compiled into your Apache server
  1470.           program. If you don't know please check whether
  1471.           <code>mod_proxy.c</code> is part of the ``<code>httpd
  1472.           -l</code>'' output. If yes, this functionality is
  1473.           available to mod_rewrite. If not, then you first have to
  1474.           rebuild the ``<code>httpd</code>'' program with mod_proxy
  1475.           enabled.</p>
  1476.         </li>
  1477.  
  1478.         <li>'<strong><code>last|L</code></strong>'
  1479.         (<strong>l</strong>ast rule)<br />
  1480.          Stop the rewriting process here and don't apply any more
  1481.         rewriting rules. This corresponds to the Perl
  1482.         <code>last</code> command or the <code>break</code> command
  1483.         from the C language. Use this flag to prevent the currently
  1484.         rewritten URL from being rewritten further by following
  1485.         rules. For example, use it to rewrite the root-path URL
  1486.         ('<code>/</code>') to a real one, <em>e.g.</em>,
  1487.         '<code>/e/www/</code>'.</li>
  1488.  
  1489.         <li>'<strong><code>next|N</code></strong>'
  1490.         (<strong>n</strong>ext round)<br />
  1491.          Re-run the rewriting process (starting again with the
  1492.         first rewriting rule). Here the URL to match is again not
  1493.         the original URL but the URL from the last rewriting rule.
  1494.         This corresponds to the Perl <code>next</code> command or
  1495.         the <code>continue</code> command from the C language. Use
  1496.         this flag to restart the rewriting process, <em>i.e.</em>,
  1497.         to immediately go to the top of the loop.<br />
  1498.          <strong>But be careful not to create an infinite
  1499.         loop!</strong></li>
  1500.  
  1501.         <li>'<strong><code>chain|C</code></strong>'
  1502.         (<strong>c</strong>hained with next rule)<br />
  1503.          This flag chains the current rule with the next rule
  1504.         (which itself can be chained with the following rule,
  1505.         <em>etc.</em>). This has the following effect: if a rule
  1506.         matches, then processing continues as usual, <em>i.e.</em>,
  1507.         the flag has no effect. If the rule does
  1508.         <strong>not</strong> match, then all following chained
  1509.         rules are skipped. For instance, use it to remove the
  1510.         ``<code>.www</code>'' part inside a per-directory rule set
  1511.         when you let an external redirect happen (where the
  1512.         ``<code>.www</code>'' part should not to occur!).</li>
  1513.  
  1514.         <li>
  1515.         '<strong><code>type|T</code></strong>=<em>MIME-type</em>'
  1516.         (force MIME <strong>t</strong>ype)<br />
  1517.          Force the MIME-type of the target file to be
  1518.         <em>MIME-type</em>. For instance, this can be used to
  1519.         simulate the <code>mod_alias</code> directive
  1520.         <code>ScriptAlias</code> which internally forces all files
  1521.         inside the mapped directory to have a MIME type of
  1522.         ``<code>application/x-httpd-cgi</code>''.</li>
  1523.  
  1524.         <li>
  1525.           '<strong><code>nosubreq|NS</code></strong>' (used only if
  1526.           <strong>n</strong>o internal
  1527.           <strong>s</strong>ub-request)<br />
  1528.            This flag forces the rewriting engine to skip a
  1529.           rewriting rule if the current request is an internal
  1530.           sub-request. For instance, sub-requests occur internally
  1531.           in Apache when <code>mod_include</code> tries to find out
  1532.           information about possible directory default files
  1533.           (<code>index.xxx</code>). On sub-requests it is not
  1534.           always useful and even sometimes causes a failure to if
  1535.           the complete set of rules are applied. Use this flag to
  1536.           exclude some rules.<br />
  1537.            
  1538.  
  1539.           <p>Use the following rule for your decision: whenever you
  1540.           prefix some URLs with CGI-scripts to force them to be
  1541.           processed by the CGI-script, the chance is high that you
  1542.           will run into problems (or even overhead) on
  1543.           sub-requests. In these cases, use this flag.</p>
  1544.         </li>
  1545.  
  1546.         <li>'<strong><code>nocase|NC</code></strong>'
  1547.         (<strong>n</strong>o <strong>c</strong>ase)<br />
  1548.          This makes the <em>Pattern</em> case-insensitive,
  1549.         <em>i.e.</em>, there is no difference between 'A-Z' and
  1550.         'a-z' when <em>Pattern</em> is matched against the current
  1551.         URL.</li>
  1552.  
  1553.         <li>'<strong><code>qsappend|QSA</code></strong>'
  1554.         (<strong>q</strong>uery <strong>s</strong>tring
  1555.         <strong>a</strong>ppend)<br />
  1556.          This flag forces the rewriting engine to append a query
  1557.         string part in the substitution string to the existing one
  1558.         instead of replacing it. Use this when you want to add more
  1559.         data to the query string via a rewrite rule.</li>
  1560.  
  1561.         <li>
  1562.           '<strong><code>noescape|NE</code></strong>'
  1563.           (<strong>n</strong>o URI <strong>e</strong>scaping of
  1564.           output)<br />
  1565.            This flag keeps mod_rewrite from applying the usual URI
  1566.           escaping rules to the result of a rewrite. Ordinarily,
  1567.           special characters (such as '%', '$', ';', and so on)
  1568.           will be escaped into their hexcode equivalents ('%25',
  1569.           '%24', and '%3B', respectively); this flag prevents this
  1570.           from being done. This allows percent symbols to appear in
  1571.           the output, as in 
  1572. <example>
  1573.     RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
  1574. </example>
  1575.  
  1576.           which would turn '<code>/foo/zed</code>' into a safe
  1577.           request for '<code>/bar?arg=P1=zed</code>'. 
  1578.         </li>
  1579.  
  1580.         <li>
  1581.           '<strong><code>passthrough|PT</code></strong>'
  1582.           (<strong>p</strong>ass <strong>t</strong>hrough to next
  1583.           handler)<br />
  1584.            This flag forces the rewriting engine to set the
  1585.           <code>uri</code> field of the internal
  1586.           <code>request_rec</code> structure to the value of the
  1587.           <code>filename</code> field. This flag is just a hack to
  1588.           be able to post-process the output of
  1589.           <code>RewriteRule</code> directives by
  1590.           <code>Alias</code>, <code>ScriptAlias</code>,
  1591.           <code>Redirect</code>, <em>etc.</em> directives from
  1592.           other URI-to-filename translators. A trivial example to
  1593.           show the semantics: If you want to rewrite
  1594.           <code>/abc</code> to <code>/def</code> via the rewriting
  1595.           engine of <code>mod_rewrite</code> and then
  1596.           <code>/def</code> to <code>/ghi</code> with
  1597.           <code>mod_alias</code>: 
  1598. <example>
  1599.     RewriteRule ^/abc(.*)  /def$1 [PT]<br />
  1600.     Alias       /def       /ghi
  1601. </example>
  1602.           If you omit the <code>PT</code> flag then
  1603.           <code>mod_rewrite</code> will do its job fine,
  1604.           <em>i.e.</em>, it rewrites <code>uri=/abc/...</code> to
  1605.           <code>filename=/def/...</code> as a full API-compliant
  1606.           URI-to-filename translator should do. Then
  1607.           <code>mod_alias</code> comes and tries to do a
  1608.           URI-to-filename transition which will not work. 
  1609.  
  1610.           <p>Note: <strong>You have to use this flag if you want to
  1611.           intermix directives of different modules which contain
  1612.           URL-to-filename translators</strong>. The typical example
  1613.           is the use of <code>mod_alias</code> and
  1614.           <code>mod_rewrite</code>..</p>
  1615.         </li>
  1616.  
  1617.         <li>'<strong><code>skip|S</code></strong>=<em>num</em>'
  1618.         (<strong>s</strong>kip next rule(s))<br />
  1619.          This flag forces the rewriting engine to skip the next
  1620.         <em>num</em> rules in sequence when the current rule
  1621.         matches. Use this to make pseudo if-then-else constructs:
  1622.         The last rule of the then-clause becomes
  1623.         <code>skip=N</code> where N is the number of rules in the
  1624.         else-clause. (This is <strong>not</strong> the same as the
  1625.         'chain|C' flag!)</li>
  1626.  
  1627.         <li>
  1628.         '<strong><code>env|E=</code></strong><em>VAR</em>:<em>VAL</em>'
  1629.         (set <strong>e</strong>nvironment variable)<br />
  1630.          This forces an environment variable named <em>VAR</em> to
  1631.         be set to the value <em>VAL</em>, where <em>VAL</em> can
  1632.         contain regexp backreferences <code>$N</code> and
  1633.         <code>%N</code> which will be expanded. You can use this
  1634.         flag more than once to set more than one variable. The
  1635.         variables can be later dereferenced in many situations, but
  1636.         usually from within XSSI (via <code><!--#echo
  1637.         var="VAR"--></code>) or CGI (<em>e.g.</em>
  1638.         <code>$ENV{'VAR'}</code>). Additionally you can dereference
  1639.         it in a following RewriteCond pattern via
  1640.         <code>%{ENV:VAR}</code>. Use this to strip but remember
  1641.         information from URLs.</li>
  1642.  
  1643.         <li>
  1644.         '<strong><code>cookie|CO=</code></strong><em>NAME</em>:<em>VAL</em>:<em>domain</em>[:<em>lifetime</em>[:<em>path</em>]]'
  1645.         (set <strong>co</strong>okie)<br />
  1646.         This sets a cookie on the client's browser.  The cookie's name
  1647.         is specified by <em>NAME</em> and the value is
  1648.         <em>VAL</em>. The <em>domain</em> field is the domain of the
  1649.         cookie, such as '.apache.org',the optional <em>lifetime</em>
  1650.     is the lifetime of the cookie in minutes, and the optional 
  1651.     <em>path</em> is the path of the cookie</li>
  1652.  
  1653.       </ul>
  1654.  
  1655. <note><title>Note</title> Never forget that <em>Pattern</em> is
  1656. applied to a complete URL in per-server configuration
  1657. files. <strong>But in per-directory configuration files, the
  1658. per-directory prefix (which always is the same for a specific
  1659. directory!) is automatically <em>removed</em> for the pattern matching
  1660. and automatically <em>added</em> after the substitution has been
  1661. done.</strong> This feature is essential for many sorts of rewriting,
  1662. because without this prefix stripping you have to match the parent
  1663. directory which is not always possible.
  1664.  
  1665.             <p>There is one exception: If a substitution string
  1666.             starts with ``<code>http://</code>'' then the directory
  1667.             prefix will <strong>not</strong> be added and an
  1668.             external redirect or proxy throughput (if flag
  1669.             <strong>P</strong> is used!) is forced!</p>
  1670. </note>
  1671.  
  1672. <note><title>Note</title>
  1673.  To enable the rewriting engine
  1674.           for per-directory configuration files you need to set
  1675.           ``<code>RewriteEngine On</code>'' in these files
  1676.           <strong>and</strong> ``<code>Options
  1677.           FollowSymLinks</code>'' must be enabled. If your
  1678.           administrator has disabled override of
  1679.           <code>FollowSymLinks</code> for a user's directory, then
  1680.           you cannot use the rewriting engine. This restriction is
  1681.           needed for security reasons.
  1682. </note>
  1683.  
  1684.       <p>Here are all possible substitution combinations and their
  1685.       meanings:</p>
  1686.  
  1687.       <p><strong>Inside per-server configuration
  1688.       (<code>httpd.conf</code>)<br />
  1689.        for request ``<code>GET
  1690.       /somepath/pathinfo</code>'':</strong><br />
  1691.       </p>
  1692.  
  1693. <note><pre>
  1694. <strong>Given Rule</strong>                                      <strong>Resulting Substitution</strong>
  1695. ----------------------------------------------  ----------------------------------
  1696. ^/somepath(.*) otherpath$1                      not supported, because invalid!
  1697.  
  1698. ^/somepath(.*) otherpath$1  [R]                 not supported, because invalid!
  1699.  
  1700. ^/somepath(.*) otherpath$1  [P]                 not supported, because invalid!
  1701. ----------------------------------------------  ----------------------------------
  1702. ^/somepath(.*) /otherpath$1                     /otherpath/pathinfo
  1703.  
  1704. ^/somepath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
  1705.                                                 via external redirection
  1706.  
  1707. ^/somepath(.*) /otherpath$1 [P]                 not supported, because silly!
  1708. ----------------------------------------------  ----------------------------------
  1709. ^/somepath(.*) http://thishost/otherpath$1      /otherpath/pathinfo
  1710.  
  1711. ^/somepath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
  1712.                                                 via external redirection
  1713.  
  1714. ^/somepath(.*) http://thishost/otherpath$1 [P]  not supported, because silly!
  1715. ----------------------------------------------  ----------------------------------
  1716. ^/somepath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
  1717.                                                 via external redirection
  1718.  
  1719. ^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
  1720.                                                 via external redirection
  1721.                                                 (the [R] flag is redundant)
  1722.  
  1723. ^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
  1724.                                                 via internal proxy
  1725. </pre></note>
  1726.  
  1727.       <p><strong>Inside per-directory configuration for
  1728.       <code>/somepath</code><br />
  1729.        (<em>i.e.</em>, file <code>.htaccess</code> in dir
  1730.       <code>/physical/path/to/somepath</code> containing
  1731.       <code>RewriteBase /somepath</code>)<br />
  1732.        for request ``<code>GET
  1733.       /somepath/localpath/pathinfo</code>'':</strong><br /> 
  1734.      </p>
  1735.  
  1736. <note><pre>
  1737. <strong>Given Rule</strong>                                      <strong>Resulting Substitution</strong>
  1738. ----------------------------------------------  ----------------------------------
  1739. ^localpath(.*) otherpath$1                      /somepath/otherpath/pathinfo
  1740.  
  1741. ^localpath(.*) otherpath$1  [R]                 http://thishost/somepath/otherpath/pathinfo
  1742.                                                 via external redirection
  1743.  
  1744. ^localpath(.*) otherpath$1  [P]                 not supported, because silly!
  1745. ----------------------------------------------  ----------------------------------
  1746. ^localpath(.*) /otherpath$1                     /otherpath/pathinfo
  1747.  
  1748. ^localpath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
  1749.                                                 via external redirection
  1750.  
  1751. ^localpath(.*) /otherpath$1 [P]                 not supported, because silly!
  1752. ----------------------------------------------  ----------------------------------
  1753. ^localpath(.*) http://thishost/otherpath$1      /otherpath/pathinfo
  1754.  
  1755. ^localpath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
  1756.                                                 via external redirection
  1757.  
  1758. ^localpath(.*) http://thishost/otherpath$1 [P]  not supported, because silly!
  1759. ----------------------------------------------  ----------------------------------
  1760. ^localpath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
  1761.                                                 via external redirection
  1762.  
  1763. ^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
  1764.                                                 via external redirection
  1765.                                                 (the [R] flag is redundant)
  1766.  
  1767. ^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
  1768.                                                 via internal proxy
  1769. </pre></note>
  1770.  
  1771.       <p><strong>Example:</strong></p>
  1772.  
  1773.       <p>We want to rewrite URLs of the form </p>
  1774.  
  1775.         <p class="indent">
  1776.           <code>/</code> <em>Language</em> <code>/~</code>
  1777.           <em>Realname</em> <code>/.../</code> <em>File</em>
  1778.         </p>
  1779.  
  1780.         <p>into </p>
  1781.  
  1782.         <p class="indent">
  1783.           <code>/u/</code> <em>Username</em> <code>/.../</code>
  1784.           <em>File</em> <code>.</code> <em>Language</em>
  1785.         </p>
  1786.  
  1787.         <p>We take the rewrite mapfile from above and save it under
  1788.         <code>/path/to/file/map.txt</code>. Then we only have to
  1789.         add the following lines to the Apache server configuration
  1790.         file:</p>
  1791.  
  1792. <example>
  1793. <pre>
  1794. RewriteLog   /path/to/file/rewrite.log
  1795. RewriteMap   real-to-user               txt:/path/to/file/map.txt
  1796. RewriteRule  ^/([^/]+)/~([^/]+)/(.*)$   /u/${real-to-user:$2|nobody}/$3.$1
  1797. </pre>
  1798.    </example>
  1799.   </usage>
  1800.  </directivesynopsis>
  1801. </modulesynopsis>
  1802.