mod_rewrite.html.en revision 36088d24dae5b2cc8124264fc6a9ba349ba81adc
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<?xml version="1.0" encoding="ISO-8859-1"?>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
28fed5323a564c1aacad7af660c2359268b44570nd XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This file is generated from xml source: DO NOT EDIT
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh -->
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<title>mod_rewrite - Apache HTTP Server</title>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<link href="/images/favicon.ico" rel="shortcut icon" /></head>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<body>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div id="page-header">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="/faq/">FAQ</a> | <a href="/glossary.html">Glossary</a> | <a href="/sitemap.html">Sitemap</a></p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<p class="apache">Apache HTTP Server Version 2.1</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<img alt="" src="/images/feather.gif" /></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div id="path">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs-project/">Documentation</a> &gt; <a href="../">Version 2.1</a> &gt; <a href="./">Modules</a></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div id="page-content">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div id="preamble"><h1>Apache Module mod_rewrite</h1>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="toplang">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<p><span>Available Languages: </span><a href="/en/mod/mod_rewrite.html" title="English">&nbsp;en&nbsp;</a></p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Provides a rule-based rewriting engine to rewrite requested
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohURLs on the fly</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="module-dict.html#Status">Status:</a></th><td>Extension</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="module-dict.html#ModuleIdentifier">Module�Identifier:</a></th><td>rewrite_module</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="module-dict.html#SourceFile">Source�File:</a></th><td>mod_rewrite.c</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="module-dict.html#Compatibility">Compatibility:</a></th><td>Available in Apache 1.3 and later</td></tr></table>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<h3>Summary</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>This module uses a rule-based rewriting engine (based on a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh regular-expression parser) to rewrite requested URLs on the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh fly. It supports an unlimited number of rules and an
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh unlimited number of attached rule conditions for each rule to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh provide a really flexible and powerful URL manipulation
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh mechanism. The URL manipulations can depend on various tests,
5408def46d326118d1a65a93a86b646008ed01e1humbedooh for instance server variables, environment variables, HTTP
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh headers, time stamps and even external database lookups in
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh various formats can be used to achieve a really granular URL
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh matching.</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p>This module operates on the full URLs (including the
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh path-info part) both in per-server context
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh (<code>httpd.conf</code>) and per-directory context
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<code>.htaccess</code>) and can even generate query-string
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh parts on result. The rewritten result can lead to internal
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh sub-processing, external request redirection or even to an
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh internal proxy throughput.</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Further details, discussion, and examples, are provided in the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <a href="/rewrite/">detailed mod_rewrite documentation</a>.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div id="quickview"><h3 class="directives">Directives</h3>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<ul id="toc">
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewritebase">RewriteBase</a></li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewritecond">RewriteCond</a></li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewriteengine">RewriteEngine</a></li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewritelock">RewriteLock</a></li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewritelog">RewriteLog</a></li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewriteloglevel">RewriteLogLevel</a></li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewritemap">RewriteMap</a></li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewriteoptions">RewriteOptions</a></li>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh<li><img alt="" src="/images/down.gif" /> <a href="#rewriterule">RewriteRule</a></li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</ul>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<h3>Topics</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<ul id="topics">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<li><img alt="" src="/images/down.gif" /> <a href="#quoting">Quoting Special Characters</a></li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<li><img alt="" src="/images/down.gif" /> <a href="#EnvVar">Environment Variables</a></li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<li><img alt="" src="/images/down.gif" /> <a href="#Solutions">Practical Solutions</a></li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</ul></div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="section">
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<h2><a name="quoting" id="quoting">Quoting Special Characters</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>As of Apache 1.3.20, special characters in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>TestString</em> and <em>Substitution</em> strings can be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh escaped (that is, treated as normal characters without their
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh usual special meaning) by prefixing them with a slash ('\')
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh character. In other words, you can include an actual
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh dollar-sign character in a <em>Substitution</em> string by
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh using '<code>\$</code>'; this keeps mod_rewrite from trying
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh to treat it as a backreference.</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="section">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<h2><a name="EnvVar" id="EnvVar">Environment Variables</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>This module keeps track of two additional (non-standard)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh CGI/SSI environment variables named <code>SCRIPT_URL</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh and <code>SCRIPT_URI</code>. These contain the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>logical</em> Web-view to the current resource, while the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh standard CGI/SSI variables <code>SCRIPT_NAME</code> and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>SCRIPT_FILENAME</code> contain the <em>physical</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh System-view. </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Notice: These variables hold the URI/URL <em>as they were
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh initially requested</em>, <em>i.e.</em>, <em>before</em> any
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rewriting. This is important because the rewriting process is
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh primarily used to rewrite logical URLs to physical
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh pathnames.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><h3>Example</h3><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohSCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
5408def46d326118d1a65a93a86b646008ed01e1humbedoohSCRIPT_FILENAME=/u/rse/.www/index.html
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedoohSCRIPT_URL=/u/rse/
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedoohSCRIPT_URI=http://en1.engelschall.com/u/rse/
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="section">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<h2><a name="Solutions" id="Solutions">Practical Solutions</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>For numerous examples of common, and not-so-common, uses for
5408def46d326118d1a65a93a86b646008ed01e1humbedooh mod_rewrite, see the <a href="/rewrite/rewrite_guide.html">Rewrite
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Guide</a>, and the <a href="/rewrite/rewrite_guide_advanced.html">Advanced Rewrite
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Guide</a> documents.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="directive-section"><h2><a name="RewriteBase" id="RewriteBase">RewriteBase</a> <a name="rewritebase" id="rewritebase">Directive</a></h2>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh<table class="directive">
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the base URL for per-directory rewrites</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteBase <em>URL-path</em></code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>See usage for information.</code></td></tr>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>directory, .htaccess</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</table>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <p>The <code class="directive">RewriteBase</code> directive explicitly
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh sets the base URL for per-directory rewrites. As you will see
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh below, <code class="directive"><a href="#rewriterule">RewriteRule</a></code>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh can be used in per-directory config files
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh (<code>.htaccess</code>). There it will act locally,
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>i.e.</em>, the local directory prefix is stripped at this
5408def46d326118d1a65a93a86b646008ed01e1humbedooh stage of processing and your rewriting rules act only on the
5408def46d326118d1a65a93a86b646008ed01e1humbedooh remainder. At the end it is automatically added back to the
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh path. The default setting is; <code class="directive">RewriteBase</code> <em>physical-directory-path</em></p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p>When a substitution occurs for a new URL, this module has
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh to re-inject the URL into the server processing. To be able
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh to do this it needs to know what the corresponding URL-prefix
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh or URL-base is. By default this prefix is the corresponding
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh filepath itself. <strong>But at most websites URLs are NOT
5408def46d326118d1a65a93a86b646008ed01e1humbedooh directly related to physical filename paths, so this
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh assumption will usually be wrong!</strong> There you have to
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh use the <code>RewriteBase</code> directive to specify the
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh correct URL-prefix.</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="note"> If your webserver's URLs are <strong>not</strong> directly
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedoohrelated to physical file paths, you have to use
5408def46d326118d1a65a93a86b646008ed01e1humbedooh<code class="directive">RewriteBase</code> in every <code>.htaccess</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohfiles where you want to use <code class="directive"><a href="#rewriterule">RewriteRule</a></code> directives.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <p> For example, assume the following per-directory config file:</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="example"><pre>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh#
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh# /abc/def/.htaccess -- per-dir config file for directory /abc/def
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh# Remember: /abc/def is the physical path of /xyz, <em>i.e.</em>, the server
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh# has a 'Alias /xyz /abc/def' directive <em>e.g.</em>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh#
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteEngine On
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh# let the server know that we were reached via /xyz and not
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh# via the physical path prefix /abc/def
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedoohRewriteBase /xyz
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh# now the rewriting rules
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteRule ^oldstuff\.html$ newstuff.html
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>In the above example, a request to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/xyz/oldstuff.html</code> gets correctly rewritten to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the physical file <code>/abc/def/newstuff.html</code>.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>For Apache Hackers</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<p>The following list gives detailed information about
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the internal processing steps:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRequest:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh /xyz/oldstuff.html
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohInternal Processing:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh /xyz/oldstuff.html -&gt; /abc/def/oldstuff.html (per-server Alias)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh /abc/def/oldstuff.html -&gt; /abc/def/newstuff.html (per-dir RewriteRule)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh /abc/def/newstuff.html -&gt; /xyz/newstuff.html (per-dir RewriteBase)
5408def46d326118d1a65a93a86b646008ed01e1humbedooh /xyz/newstuff.html -&gt; /abc/def/newstuff.html (per-server Alias)
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedoohResult:
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh /abc/def/newstuff.html
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</pre>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p>This seems very complicated but is
5408def46d326118d1a65a93a86b646008ed01e1humbedooh the correct Apache internal processing, because the
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh per-directory rewriting comes too late in the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh process. So, when it occurs the (rewritten) request
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh has to be re-injected into the Apache kernel! BUT:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh While this seems like a serious overhead, it really
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh isn't, because this re-injection happens fully
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh internally to the Apache server and the same
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh procedure is used by many other operations inside
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Apache. So, you can be sure the design and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh implementation is correct.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="directive-section"><h2><a name="RewriteCond" id="RewriteCond">RewriteCond</a> <a name="rewritecond" id="rewritecond">Directive</a></h2>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<table class="directive">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Defines a condition under which rewriting will take place
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code> RewriteCond
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>TestString</em> <em>CondPattern</em></code></td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</table>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <p>The <code class="directive">RewriteCond</code> directive defines a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rule condition. Precede a <code class="directive"><a href="#rewriterule">RewriteRule</a></code> directive with one
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh or more <code class="directive">RewriteCond</code> directives. The following
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rewriting rule is only used if its pattern matches the current
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh state of the URI <strong>and</strong> if these additional
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh conditions apply too.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p><em>TestString</em> is a string which can contains the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh following expanded constructs in addition to plain text:</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <ul>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <li>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <strong>RewriteRule backreferences</strong>: These are
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh backreferences of the form
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p class="indent">
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <strong><code>$N</code></strong>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (0 &lt;= N &lt;= 9) which provide access to the grouped
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh parts (parenthesis!) of the pattern from the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh corresponding <code>RewriteRule</code> directive (the one
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh following the current bunch of <code>RewriteCond</code>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh directives).
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>RewriteCond backreferences</strong>: These are
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh backreferences of the form
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p class="indent">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>%N</code></strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
b0f3904bd0a4fd47ac0f508c88379b39dd912d0dhumbedooh (1 &lt;= N &lt;= 9) which provide access to the grouped
5408def46d326118d1a65a93a86b646008ed01e1humbedooh parts (parentheses!) of the pattern from the last matched
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>RewriteCond</code> directive in the current bunch
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh of conditions.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>RewriteMap expansions</strong>: These are
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh expansions of the form
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p class="indent">
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <strong><code>${mapname:key|default}</code></strong>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh See <a href="#mapfunc">the documentation for
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh RewriteMap</a> for more details.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>Server-Variables</strong>: These are variables of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the form
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p class="indent">
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <strong><code>%{</code> <em>NAME_OF_VARIABLE</em>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <code>}</code></strong>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh </p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh where <em>NAME_OF_VARIABLE</em> can be a string taken
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh from the following list:
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <table>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <th>HTTP headers:</th> <th>connection &amp; request:</th> <th />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh </tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <td>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh HTTP_USER_AGENT<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh HTTP_REFERER<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh HTTP_COOKIE<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh HTTP_FORWARDED<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh HTTP_HOST<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh HTTP_PROXY_CONNECTION<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh HTTP_ACCEPT<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </td>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <td>
1784f96e3c9d47bf36a4d973d47e3857f260fc7dhumbedooh REMOTE_ADDR<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh REMOTE_HOST<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh REMOTE_PORT<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh REMOTE_USER<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh REMOTE_IDENT<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh REQUEST_METHOD<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh SCRIPT_FILENAME<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh PATH_INFO<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh QUERY_STRING<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh AUTH_TYPE<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </td>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <td />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <th>server internals:</th> <th>date and time:</th> <th>specials:</th>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <td>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh DOCUMENT_ROOT<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh SERVER_ADMIN<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh SERVER_NAME<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh SERVER_ADDR<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh SERVER_PORT<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh SERVER_PROTOCOL<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh SERVER_SOFTWARE<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </td>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <td>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TIME_YEAR<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TIME_MON<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TIME_DAY<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TIME_HOUR<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TIME_MIN<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TIME_SEC<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TIME_WDAY<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TIME<br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh </td>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <td>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh API_VERSION<br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh THE_REQUEST<br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh REQUEST_URI<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh REQUEST_FILENAME<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh IS_SUBREQ<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh HTTPS<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </td>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </table>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>These variables all
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh correspond to the similarly named HTTP
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh MIME-headers, C variables of the Apache server or
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>struct tm</code> fields of the Unix system.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Most are documented elsewhere in the Manual or in
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh the CGI specification. Those that are special to
5408def46d326118d1a65a93a86b646008ed01e1humbedooh mod_rewrite include:</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <dl>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <dt><code>IS_SUBREQ</code></dt>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <dd>Will contain the text "true" if the request
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh currently being processed is a sub-request,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh "false" otherwise. Sub-requests may be generated
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh by modules that need to resolve additional files
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh or URIs in order to complete their tasks.</dd>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dt><code>API_VERSION</code></dt>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dd>This is the version of the Apache module API
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (the internal interface between server and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh module) in the current httpd build, as defined in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh include/ap_mmn.h. The module API version
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh corresponds to the version of Apache in use (in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the release version of Apache 1.3.14, for
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh instance, it is 19990320:10), but is mainly of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh interest to module authors.</dd>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dt><code>THE_REQUEST</code></dt>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dd>The full HTTP request line sent by the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh browser to the server (e.g., "<code>GET
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh /index.html HTTP/1.1</code>"). This does not
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh include any additional headers sent by the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh browser.</dd>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dt><code>REQUEST_URI</code></dt>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dd>The resource requested in the HTTP request
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh line. (In the example above, this would be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh "/index.html".)</dd>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dt><code>REQUEST_FILENAME</code></dt>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dd>The full local filesystem path to the file or
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh script matching the request.</dd>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dt><code>HTTPS</code></dt>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dd>Will contain the text "on" if the connection is
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh using SSL/TLS, or "off" otherwise. (This variable
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh can be safely used regardless of whether
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code class="module"><a href="/mod/mod_ssl.html">mod_ssl</a></code> is loaded).</dd>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </dl>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Special Notes:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <ol>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>The variables SCRIPT_FILENAME and REQUEST_FILENAME
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh contain the same value, <em>i.e.</em>, the value of the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>filename</code> field of the internal
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>request_rec</code> structure of the Apache server.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh The first name is just the commonly known CGI variable name
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh while the second is the consistent counterpart to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh REQUEST_URI (which contains the value of the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>uri</code> field of <code>request_rec</code>).</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>There is the special format:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>%{ENV:variable}</code> where <em>variable</em> can be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh any environment variable. This is looked-up via internal
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Apache structures and (if not found there) via
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>getenv()</code> from the Apache server process.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <li>There is the special format:
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <code>%{SSL:variable}</code> where <em>variable</em> is the
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh name of an <a href="mod_ssl.html#envvars">SSL environment
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh variable</a>; this can be used whether or not
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <code class="module"><a href="/mod/mod_ssl.html">mod_ssl</a></code> is loaded, but will always expand to
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh the empty string if it is not. Example:
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>128</code>.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <li>There is the special format:
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <code>%{HTTP:header}</code> where <em>header</em> can be
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh any HTTP MIME-header name. This is looked-up from the HTTP
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh request. Example: <code>%{HTTP:Proxy-Connection}</code> is
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the value of the HTTP header
2012d5e61d7a0648e2831321bad89085ea4718d3humbedooh ``<code>Proxy-Connection:</code>''.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
2012d5e61d7a0648e2831321bad89085ea4718d3humbedooh <li>There is the special format
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>%{LA-U:variable}</code> for look-aheads which perform
2012d5e61d7a0648e2831321bad89085ea4718d3humbedooh an internal (URL-based) sub-request to determine the final
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh value of <em>variable</em>. Use this when you want to use a
2012d5e61d7a0648e2831321bad89085ea4718d3humbedooh variable for rewriting which is actually set later in an
5408def46d326118d1a65a93a86b646008ed01e1humbedooh API phase and thus is not available at the current stage.
2012d5e61d7a0648e2831321bad89085ea4718d3humbedooh For instance when you want to rewrite according to the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>REMOTE_USER</code> variable from within the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh per-server context (<code>httpd.conf</code> file) you have
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh to use <code>%{LA-U:REMOTE_USER}</code> because this
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh variable is set by the authorization phases which come
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>after</em> the URL translation phase where mod_rewrite
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh operates. On the other hand, because mod_rewrite implements
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh its per-directory context (<code>.htaccess</code> file) via
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the Fixup phase of the API and because the authorization
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh phases come <em>before</em> this phase, you just can use
afcfeaafe0f4332a9abc222501b8528d5afdbe36humbedooh <code>%{REMOTE_USER}</code> there.</li>
afcfeaafe0f4332a9abc222501b8528d5afdbe36humbedooh
afcfeaafe0f4332a9abc222501b8528d5afdbe36humbedooh <li>There is the special format:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>%{LA-F:variable}</code> which performs an internal
afcfeaafe0f4332a9abc222501b8528d5afdbe36humbedooh (filename-based) sub-request to determine the final value
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh of <em>variable</em>. Most of the time this is the same as
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh LA-U above.</li>
afcfeaafe0f4332a9abc222501b8528d5afdbe36humbedooh </ol>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p><em>CondPattern</em> is the condition pattern,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>i.e.</em>, a regular expression which is applied to the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh current instance of the <em>TestString</em>, <em>i.e.</em>,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>TestString</em> is evaluated and then matched against
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>CondPattern</em>.</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p><strong>Remember:</strong> <em>CondPattern</em> is a
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>perl compatible regular expression</em> with some
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh additions:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <ol>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>You can prefix the pattern string with a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<code>!</code>' character (exclamation mark) to specify a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>non</strong>-matching pattern.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh There are some special variants of <em>CondPatterns</em>.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Instead of real regular expression strings you can also
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh use one of the following:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong>&lt;CondPattern</strong>' (is lexically
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh lower)<br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh Treats the <em>CondPattern</em> as a plain string and
5408def46d326118d1a65a93a86b646008ed01e1humbedooh compares it lexically to <em>TestString</em>. True if
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>TestString</em> is lexically lower than
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>CondPattern</em>.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong>&gt;CondPattern</strong>' (is lexically
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh greater)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Treats the <em>CondPattern</em> as a plain string and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh compares it lexically to <em>TestString</em>. True if
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>TestString</em> is lexically greater than
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>CondPattern</em>.</li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <li>'<strong>=CondPattern</strong>' (is lexically
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh equal)<br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh Treats the <em>CondPattern</em> as a plain string and
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh compares it lexically to <em>TestString</em>. True if
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>TestString</em> is lexically equal to
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>CondPattern</em>, i.e the two strings are exactly
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh equal (character by character). If <em>CondPattern</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh is just <code>""</code> (two quotation marks) this
5408def46d326118d1a65a93a86b646008ed01e1humbedooh compares <em>TestString</em> to the empty string.</li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <li>'<strong>-d</strong>' (is
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>d</strong>irectory)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Treats the <em>TestString</em> as a pathname and tests
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh if it exists and is a directory.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong>-f</strong>' (is regular
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>f</strong>ile)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Treats the <em>TestString</em> as a pathname and tests
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh if it exists and is a regular file.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong>-s</strong>' (is regular file with
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>s</strong>ize)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Treats the <em>TestString</em> as a pathname and tests
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh if it exists and is a regular file with size greater
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh than zero.</li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <li>'<strong>-l</strong>' (is symbolic
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <strong>l</strong>ink)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Treats the <em>TestString</em> as a pathname and tests
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh if it exists and is a symbolic link.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong>-x</strong>' (has e<strong>x</strong>ecutable
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh permissions)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Treats the <em>TestString</em> as a pathname and tests
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh if it exists and has execution permissions. These permissions
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh are determined depending on the underlying OS.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong>-F</strong>' (is existing file via
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh subrequest)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Checks if <em>TestString</em> is a valid file and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh accessible via all the server's currently-configured
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh access controls for that path. This uses an internal
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh subrequest to determine the check, so use it with care
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh because it decreases your servers performance!</li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <li>'<strong>-U</strong>' (is existing URL via
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh subrequest)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Checks if <em>TestString</em> is a valid URL and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh accessible via all the server's currently-configured
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh access controls for that path. This uses an internal
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh subrequest to determine the check, so use it with care
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh because it decreases your server's performance!</li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh </ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>Notice</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh All of these tests can
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh also be prefixed by an exclamation mark ('!') to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh negate their meaning.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </ol>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Additionally you can set special flags for
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>CondPattern</em> by appending</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p class="indent">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>[</code><em>flags</em><code>]</code></strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>as the third argument to the <code>RewriteCond</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh directive. <em>Flags</em> is a comma-separated list of the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh following flags:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>nocase|NC</code></strong>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>n</strong>o <strong>c</strong>ase)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This makes the test case-insensitive, <em>i.e.</em>, there
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh is no difference between 'A-Z' and 'a-z' both in the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh expanded <em>TestString</em> and the <em>CondPattern</em>.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This flag is effective only for comparisons between
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>TestString</em> and <em>CondPattern</em>. It has no
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh effect on filesystem and subrequest checks.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<strong><code>ornext|OR</code></strong>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>or</strong> next condition)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Use this to combine rule conditions with a local OR
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh instead of the implicit AND. Typical example:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteCond %{REMOTE_HOST} ^host1.* [OR]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteCond %{REMOTE_HOST} ^host2.* [OR]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteCond %{REMOTE_HOST} ^host3.*
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteRule ...some special stuff for any of these hosts...
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Without this flag you would have to write the cond/rule
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh three times.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p><strong>Example:</strong></p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>To rewrite the Homepage of a site according to the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<code>User-Agent:</code>'' header of the request, you can
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh use the following: </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteRule ^/$ /homepage.max.html [L]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteCond %{HTTP_USER_AGENT} ^Lynx.*
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteRule ^/$ /homepage.min.html [L]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteRule ^/$ /homepage.std.html [L]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Interpretation: If you use Netscape Navigator as your
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh browser (which identifies itself as 'Mozilla'), then you
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh get the max homepage, which includes Frames, <em>etc.</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh If you use the Lynx browser (which is Terminal-based), then
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh you get the min homepage, which contains no images, no
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh tables, <em>etc.</em> If you use any other browser you get
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the standard homepage.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="directive-section"><h2><a name="RewriteEngine" id="RewriteEngine">RewriteEngine</a> <a name="rewriteengine" id="rewriteengine">Directive</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<table class="directive">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Enables or disables runtime rewriting engine</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteEngine on|off</code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>RewriteEngine off</code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</table>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>The <code class="directive">RewriteEngine</code> directive enables or
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh disables the runtime rewriting engine. If it is set to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>off</code> this module does no runtime processing at
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh all. It does not even update the <code>SCRIPT_URx</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh environment variables.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Use this directive to disable the module instead of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh commenting out all the <code class="directive"><a href="#rewriterule">RewriteRule</a></code> directives!</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Note that, by default, rewrite configurations are not
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh inherited. This means that you need to have a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>RewriteEngine on</code> directive for each virtual host
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh in which you wish to use it.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="directive-section"><h2><a name="RewriteLock" id="RewriteLock">RewriteLock</a> <a name="rewritelock" id="rewritelock">Directive</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<table class="directive">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the name of the lock file used for <code class="directive"><a href="#rewritemap">RewriteMap</a></code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohsynchronization</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteLock <em>file-path</em></code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</table>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>This directive sets the filename for a synchronization
5408def46d326118d1a65a93a86b646008ed01e1humbedooh lockfile which mod_rewrite needs to communicate with <code class="directive"><a href="#rewritemap">RewriteMap</a></code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>programs</em>. Set this lockfile to a local path (not on a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh NFS-mounted device) when you want to use a rewriting
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh map-program. It is not required for other types of rewriting
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh maps.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="directive-section"><h2><a name="RewriteLog" id="RewriteLog">RewriteLog</a> <a name="rewritelog" id="rewritelog">Directive</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<table class="directive">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the name of the file used for logging rewrite engine
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohprocessing</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteLog <em>file-path</em></code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</table>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p>The <code class="directive">RewriteLog</code> directive sets the name
5408def46d326118d1a65a93a86b646008ed01e1humbedooh of the file to which the server logs any rewriting actions it
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh performs. If the name does not begin with a slash
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ('<code>/</code>') then it is assumed to be relative to the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Server Root</em>. The directive should occur only once per
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh server config.</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="note"> To disable the logging of
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh rewriting actions it is not recommended to set
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>Filename</em> to <code>/dev/null</code>, because
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh although the rewriting engine does not then output to a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh logfile it still creates the logfile output internally.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>This will slow down the server with no advantage
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh to the administrator!</strong> To disable logging either
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh remove or comment out the <code class="directive">RewriteLog</code>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh directive or use <code>RewriteLogLevel 0</code>!
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>Security</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohSee the <a href="/misc/security_tips.html">Apache Security Tips</a>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohdocument for details on why your security could be compromised if the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohdirectory where logfiles are stored is writable by anyone other than
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohthe user that starts the server.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><h3>Example</h3><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteLog "/usr/local/var/apache/logs/rewrite.log"
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="directive-section"><h2><a name="RewriteLogLevel" id="RewriteLogLevel">RewriteLogLevel</a> <a name="rewriteloglevel" id="rewriteloglevel">Directive</a></h2>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<table class="directive">
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the verbosity of the log file used by the rewrite
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedoohengine</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteLogLevel <em>Level</em></code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>RewriteLogLevel 0</code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</table>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>The <code class="directive">RewriteLogLevel</code> directive sets the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh verbosity level of the rewriting logfile. The default level 0
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh means no logging, while 9 or more means that practically all
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh actions are logged.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>To disable the logging of rewriting actions simply set
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Level</em> to 0. This disables all rewrite action
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh logs.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"> Using a high value for
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Level</em> will slow down your Apache server
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh dramatically! Use the rewriting logfile at a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Level</em> greater than 2 only for debugging!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><h3>Example</h3><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteLogLevel 3
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="directive-section"><h2><a name="RewriteMap" id="RewriteMap">RewriteMap</a> <a name="rewritemap" id="rewritemap">Directive</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<table class="directive">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Defines a mapping function for key-lookup</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteMap <em>MapName</em> <em>MapType</em>:<em>MapSource</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>The choice of different dbm types is available in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohApache 2.0.41 and later</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</table>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>The <code class="directive">RewriteMap</code> directive defines a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Rewriting Map</em> which can be used inside rule
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh substitution strings by the mapping-functions to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh insert/substitute fields through a key lookup. The source of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh this lookup can be of various types.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>The <a id="mapfunc" name="mapfunc"><em>MapName</em></a> is
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh the name of the map and will be used to specify a
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh mapping-function for the substitution strings of a rewriting
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rule via one of the following constructs:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p class="indent">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>${</code> <em>MapName</em> <code>:</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>LookupKey</em> <code>}</code><br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <code>${</code> <em>MapName</em> <code>:</code>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>LookupKey</em> <code>|</code> <em>DefaultValue</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>}</code></strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p>When such a construct occurs the map <em>MapName</em> is
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh consulted and the key <em>LookupKey</em> is looked-up. If the
5408def46d326118d1a65a93a86b646008ed01e1humbedooh key is found, the map-function construct is substituted by
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>SubstValue</em>. If the key is not found then it is
5408def46d326118d1a65a93a86b646008ed01e1humbedooh substituted by <em>DefaultValue</em> or by the empty string
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh if no <em>DefaultValue</em> was specified.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>For example, you might define a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code class="directive">RewriteMap</code> as:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <div class="example"><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh RewriteMap examplemap txt:/path/to/file/map.txt
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>You would then be able to use this map in a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code class="directive">RewriteRule</code> as follows:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <div class="example"><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh RewriteRule ^/ex/(.*) ${examplemap:$1}
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>The following combinations for <em>MapType</em> and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>MapSource</em> can be used:</p>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <ul>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <strong>Standard Plain Text</strong><br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh MapType: <code>txt</code>, MapSource: Unix filesystem
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh path to valid regular file
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>This is the standard rewriting map feature where the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>MapSource</em> is a plain ASCII file containing
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh either blank lines, comment lines (starting with a '#'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh character) or pairs like the following - one per
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh line.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p class="indent">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><em>MatchingKey</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>SubstValue</em></strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><h3>Example</h3><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh##
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh## map.txt -- rewriting map
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh##
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRalf.S.Engelschall rse # Bastard Operator From Hell
5408def46d326118d1a65a93a86b646008ed01e1humbedoohMr.Joe.Average joe # Mr. Average
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteMap real-to-user txt:/path/to/file/map.txt
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>Randomized Plain Text</strong><br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh MapType: <code>rnd</code>, MapSource: Unix filesystem
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh path to valid regular file
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p>This is identical to the Standard Plain Text variant
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh above but with a special post-processing feature: After
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh looking up a value it is parsed according to contained
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<code>|</code>'' characters which have the meaning of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``or''. In other words they indicate a set of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh alternatives from which the actual returned value is
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh chosen randomly. For example, you might use the following map
5408def46d326118d1a65a93a86b646008ed01e1humbedooh file and directives to provide a random load balancing between
5408def46d326118d1a65a93a86b646008ed01e1humbedooh several back-end server, via a reverse-proxy. Images are sent
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh to one of the servers in the 'static' pool, while everything
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh else is sent to one of the 'dynamic' pool.</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p>Example:</p>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<div class="example"><h3>Rewrite map file</h3><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh##
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh## map.txt -- rewriting map
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh##
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohstatic www1|www2|www3|www4
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohdynamic www5|www6
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><h3>Configuration directives</h3><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteMap servers rnd:/path/to/file/map.txt<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh[NC,P,L]<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteRule ^/(.*) http://${servers:dynamic}/$1 [P,L]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>Hash File</strong><br /> MapType:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>dbm[=<em>type</em>]</code>, MapSource: Unix filesystem
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh path to valid regular file
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Here the source is a binary format DBM file containing
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the same contents as a <em>Plain Text</em> format file, but
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh in a special representation which is optimized for really
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh fast lookups. The <em>type</em> can be sdbm, gdbm, ndbm, or
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh db depending on <a href="/install.html#dbm">compile-time
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh settings</a>. If the <em>type</em> is omitted, the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh compile-time default will be chosen. You can create such a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh file with any DBM tool or with the following Perl
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh script. Be sure to adjust it to create the appropriate
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh type of DBM. The example creates an NDBM file.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh#!/path/to/bin/perl
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh##
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh## txt2dbm -- convert txt map to dbm format
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh##
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedoohuse NDBM_File;
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohuse Fcntl;
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh($txtmap, $dbmmap) = @ARGV;
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohopen(TXT, "&lt;$txtmap") or die "Couldn't open $txtmap!\n";
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohtie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh or die "Couldn't create $dbmmap!\n";
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohwhile (&lt;TXT&gt;) {
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh next if (/^\s*#/ or /^\s*$/);
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh $DB{$1} = $2 if (/^\s*(\S+)\s+(\S+)/);
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh}
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohuntie %DB;
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohclose(TXT);
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh$ txt2dbm map.txt map.db
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>Internal Function</strong><br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh MapType: <code>int</code>, MapSource: Internal Apache
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh function
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Here the source is an internal Apache function.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Currently you cannot create your own, but the following
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh functions already exists:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li><strong>toupper</strong>:<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Converts the looked up key to all upper case.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li><strong>tolower</strong>:<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Converts the looked up key to all lower case.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li><strong>escape</strong>:<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Translates special characters in the looked up key to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh hex-encodings.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li><strong>unescape</strong>:<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Translates hex-encodings in the looked up key back to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh special characters.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>External Rewriting Program</strong><br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh MapType: <code>prg</code>, MapSource: Unix filesystem
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh path to valid regular file
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Here the source is a program, not a map file. To
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh create it you can use the language of your choice, but
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the result has to be a executable (<em>i.e.</em>, either
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh object-code or a script with the magic cookie trick
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<code>#!/path/to/interpreter</code>' as the first
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh line).</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>This program is started once at startup of the Apache
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh servers and then communicates with the rewriting engine
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh over its <code>stdin</code> and <code>stdout</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh file-handles. For each map-function lookup it will
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh receive the key to lookup as a newline-terminated string
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh on <code>stdin</code>. It then has to give back the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh looked-up value as a newline-terminated string on
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>stdout</code> or the four-character string
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<code>NULL</code>'' if it fails (<em>i.e.</em>, there
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh is no corresponding value for the given key). A trivial
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh program which will implement a 1:1 map (<em>i.e.</em>,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh key == value) could be:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh#!/usr/bin/perl
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh$| = 1;
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohwhile (&lt;STDIN&gt;) {
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh # ...put here any transformations or lookups...
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh print $_;
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh}
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>But be very careful:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <ol>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>``<em>Keep it simple, stupid</em>'' (KISS), because
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh if this program hangs it will hang the Apache server
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh when the rule occurs.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>Avoid one common mistake: never do buffered I/O on
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>stdout</code>! This will cause a deadloop! Hence
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the ``<code>$|=1</code>'' in the above example...</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>Use the <code class="directive"><a href="#rewritelock">RewriteLock</a></code> directive to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh define a lockfile mod_rewrite can use to synchronize the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh communication to the program. By default no such
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh synchronization takes place.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </ol>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>The <code class="directive">RewriteMap</code> directive can occur more than
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh once. For each mapping-function use one
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code class="directive">RewriteMap</code> directive to declare its rewriting
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh mapfile. While you cannot <strong>declare</strong> a map in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh per-directory context it is of course possible to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>use</strong> this map in per-directory context. </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>Note</h3> For plain text and DBM format files the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohlooked-up keys are cached in-core until the <code>mtime</code> of the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohmapfile changes or the server does a restart. This way you can have
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohmap-functions in rules which are used for <strong>every</strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohrequest. This is no problem, because the external lookup only happens
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohonce!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="directive-section"><h2><a name="RewriteOptions" id="RewriteOptions">RewriteOptions</a> <a name="rewriteoptions" id="rewriteoptions">Directive</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<table class="directive">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets some special options for the rewrite engine</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteOptions <var>Options</var></code></td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td><code>MaxRedirects</code> is no longer available in version 2.1 and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohlater</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</table>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p>The <code class="directive">RewriteOptions</code> directive sets some
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh special options for the current per-server or per-directory
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh configuration. The <em>Option</em> string can be currently only one:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dl>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dt><code>inherit</code></dt>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <dd>This forces the current configuration to inherit the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh configuration of the parent. In per-virtual-server context
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh this means that the maps, conditions and rules of the main
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh server are inherited. In per-directory context this means
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh that conditions and rules of the parent directory's
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <code>.htaccess</code> configuration are inherited.</dd>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh </dl>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="directive-section"><h2><a name="RewriteRule" id="RewriteRule">RewriteRule</a> <a name="rewriterule" id="rewriterule">Directive</a></h2>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<table class="directive">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Defines rules for the rewriting engine</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteRule
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Pattern</em> <em>Substitution</em></code></td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>The cookie-flag is available in Apache 2.0.40 and later.</td></tr>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</table>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>The <code class="directive">RewriteRule</code> directive is the real
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rewriting workhorse. The directive can occur more than once.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Each directive then defines one single rewriting rule. The
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <strong>definition order</strong> of these rules is
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <strong>important</strong>, because this order is used when
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh applying the rules at run-time.</p>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p><a id="patterns" name="patterns"><em>Pattern</em></a> is
5408def46d326118d1a65a93a86b646008ed01e1humbedooh a perl compatible <a id="regexp" name="regexp">regular
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh expression</a> which gets applied to the current URL. Here
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``current'' means the value of the URL when this rule gets
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh applied. This may not be the originally requested URL,
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh because any number of rules may already have matched and made
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh alterations to it.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Some hints about the syntax of regular expressions:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<strong>Text:</strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>.</code></strong> Any single character
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>[</code></strong>chars<strong><code>]</code></strong> Character class: One of chars
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>[^</code></strong>chars<strong><code>]</code></strong> Character class: None of chars
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh text1<strong><code>|</code></strong>text2 Alternative: text1 or text2
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh<strong>Quantifiers:</strong>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <strong><code>?</code></strong> 0 or 1 of the preceding text
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>*</code></strong> 0 or N of the preceding text (N &gt; 0)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>+</code></strong> 1 or N of the preceding text (N &gt; 1)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<strong>Grouping:</strong>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <strong><code>(</code></strong>text<strong><code>)</code></strong> Grouping of text
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh (either to set the borders of an alternative or
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh for making backreferences where the <strong>N</strong>th group can
5408def46d326118d1a65a93a86b646008ed01e1humbedooh be used on the RHS of a RewriteRule with <code>$</code><strong>N</strong>)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<strong>Anchors:</strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>^</code></strong> Start of line anchor
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>$</code></strong> End of line anchor
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<strong>Escaping:</strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong><code>\</code></strong>char escape that particular char
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (for instance to specify the chars "<code>.[]()</code>" <em>etc.</em>)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>For more information about regular expressions have a look at the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh perl regular expression manpage ("<a href="http://www.perldoc.com/perl5.6.1/pod/perlre.html">perldoc
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh perlre</a>"). If you are interested in more detailed
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh information about regular expressions and their variants
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (POSIX regex <em>etc.</em>) have a look at the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh following dedicated book on this topic:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p class="indent">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Mastering Regular Expressions, 2nd Edition</em><br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Jeffrey E.F. Friedl<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh O'Reilly &amp; Associates, Inc. 2002<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ISBN 0-596-00289-0<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Additionally in mod_rewrite the NOT character
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ('<code>!</code>') is a possible pattern prefix. This gives
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh you the ability to negate a pattern; to say, for instance:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<em>if the current URL does <strong>NOT</strong> match this
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh pattern</em>''. This can be used for exceptional cases, where
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh it is easier to match the negative pattern, or as a last
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh default rule.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>Notice</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohWhen using the NOT character
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh to negate a pattern you cannot have grouped wildcard
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh parts in the pattern. This is impossible because when the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh pattern does NOT match, there are no contents for the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh groups. In consequence, if negated patterns are used, you
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh cannot use <code>$N</code> in the substitution
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh string!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p><a id="rhs" name="rhs"><em>Substitution</em></a> of a
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh rewriting rule is the string which is substituted for (or
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh replaces) the original URL for which <em>Pattern</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh matched. Beside plain text you can use</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <ol>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>back-references <code>$N</code> to the RewriteRule
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh pattern</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>back-references <code>%N</code> to the last matched
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh RewriteCond pattern</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <li>server-variables as in rule condition test-strings
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh (<code>%{VARNAME}</code>)</li>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <li><a href="#mapfunc">mapping-function</a> calls
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh (<code>${mapname:key|default}</code>)</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </ol>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Back-references are <code>$</code><strong>N</strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>N</strong>=0..9) identifiers which will be replaced
5408def46d326118d1a65a93a86b646008ed01e1humbedooh by the contents of the <strong>N</strong>th group of the
5408def46d326118d1a65a93a86b646008ed01e1humbedooh matched <em>Pattern</em>. The server-variables are the same
d5f549d9022aee3727a1278486dc80124198ac26humbedooh as for the <em>TestString</em> of a <code>RewriteCond</code>
5408def46d326118d1a65a93a86b646008ed01e1humbedooh directive. The mapping-functions come from the
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <code>RewriteMap</code> directive and are explained there.
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh These three types of variables are expanded in the order of
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh the above list. </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>As already mentioned above, all the rewriting rules are
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh applied to the <em>Substitution</em> (in the order of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh definition in the config file). The URL is <strong>completely
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh replaced</strong> by the <em>Substitution</em> and the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rewriting process goes on until there are no more rules
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh unless explicitly terminated by a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code><strong>L</strong></code> flag - see below.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>There is a special substitution string named
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<code>-</code>' which means: <strong>NO
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh substitution</strong>! Sounds silly? No, it is useful to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh provide rewriting rules which <strong>only</strong> match
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh some URLs but do no substitution, <em>e.g.</em>, in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh conjunction with the <strong>C</strong> (chain) flag to be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh able to have more than one pattern to be applied before a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh substitution occurs.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>Query String</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>The <em>Pattern</em> will not match against the query string.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Instead, you must use a <code class="directive"><a href="#rewritecond">RewriteCond</a></code> with the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>%{QUERY_STRING}</code> variable. You can, however, create
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh URLs in the substitution string containing a query string
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh part. Just use a question mark inside the substitution string to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh indicate that the following stuff should be re-injected into the
5408def46d326118d1a65a93a86b646008ed01e1humbedooh query string. When you want to erase an existing query string,
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh end the substitution string with just the question mark. To
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh combine a new query string with an old one, use the
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <code>[QSA]</code> flag (see below).</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>Substitution of Absolute URLs</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>There is a special feature:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh When you prefix a substitution field with
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>http://</code><em>thishost</em>[<em>:thisport</em>]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh then <strong>mod_rewrite</strong> automatically strips it
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh out. This auto-reduction on implicit external redirect
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh URLs is a useful and important feature when used in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh combination with a mapping-function which generates the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh hostname part. Have a look at the first example in the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh example section below to understand this.</p>
c10b2604e59ba7d8fe42fb5eefbdc0ba4180c929humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p><strong>Remember:</strong> An unconditional external
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh redirect to your own server will not work with the prefix
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>http://thishost</code> because of this feature. To
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh achieve such a self-redirect, you have to use the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>R</strong>-flag (see below).</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Additionally you can set special <a name="rewriteflags" id="rewriteflags">flags</a> for <em>Substitution</em> by
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh appending</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <p class="indent">
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <strong><code>[</code><em>flags</em><code>]</code></strong>
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh as the third argument to the <code>RewriteRule</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh directive. <em>Flags</em> is a comma-separated list of the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh following flags: </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>chain|C</code></strong>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>c</strong>hained with next rule)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This flag chains the current rule with the next rule
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (which itself can be chained with the following rule,
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>etc.</em>). This has the following effect: if a rule
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh matches, then processing continues as usual, <em>i.e.</em>,
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh the flag has no effect. If the rule does
5408def46d326118d1a65a93a86b646008ed01e1humbedooh <strong>not</strong> match, then all following chained
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh rules are skipped. For instance, use it to remove the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<code>.www</code>'' part inside a per-directory rule set
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh when you let an external redirect happen (where the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<code>.www</code>'' part should not to occur!).</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<strong><code>cookie|CO=</code></strong><em>NAME</em>:<em>VAL</em>:<em>domain</em>[:<em>lifetime</em>[:<em>path</em>]]'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (set <strong>co</strong>okie)<br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh This sets a cookie on the client's browser. The cookie's name
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh is specified by <em>NAME</em> and the value is
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh <em>VAL</em>. The <em>domain</em> field is the domain of the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh cookie, such as '.apache.org',the optional <em>lifetime</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh is the lifetime of the cookie in minutes, and the optional
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>path</em> is the path of the cookie</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
9f82a7343f0a2f0721e0e0e1e881b06739003506humbedooh '<strong><code>env|E=</code></strong><em>VAR</em>:<em>VAL</em>'
9f82a7343f0a2f0721e0e0e1e881b06739003506humbedooh (set <strong>e</strong>nvironment variable)<br />
9f82a7343f0a2f0721e0e0e1e881b06739003506humbedooh This forces an environment variable named <em>VAR</em> to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh be set to the value <em>VAL</em>, where <em>VAL</em> can
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh contain regexp backreferences <code>$N</code> and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>%N</code> which will be expanded. You can use this
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh flag more than once to set more than one variable. The
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh variables can be later dereferenced in many situations, but
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh usually from within XSSI (via <code>&lt;!--#echo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh var="VAR"--&gt;</code>) or CGI (<em>e.g.</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>$ENV{'VAR'}</code>). Additionally you can dereference
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh it in a following RewriteCond pattern via
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>%{ENV:VAR}</code>. Use this to strip but remember
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh information from URLs.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>forbidden|F</code></strong>' (force URL
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh to be <strong>f</strong>orbidden)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This forces the current URL to be forbidden,
d5f549d9022aee3727a1278486dc80124198ac26humbedooh <em>i.e.</em>, it immediately sends back a HTTP response of
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh 403 (FORBIDDEN). Use this flag in conjunction with
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh appropriate RewriteConds to conditionally block some
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh URLs.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>gone|G</code></strong>' (force URL to be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>g</strong>one)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This forces the current URL to be gone, <em>i.e.</em>, it
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh immediately sends back a HTTP response of 410 (GONE). Use
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh this flag to mark pages which no longer exist as gone.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<strong><code>handler|H</code></strong>=<em>Content-handler</em>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (force Content <strong>h</strong>andler)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Force the Content-handler of the target file to be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Content-handler</em>. For instance, this can be used to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh simulate the <code>mod_alias</code> directive
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>ScriptAlias</code> which internally forces all files
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh inside the mapped directory to have a handler of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<code>cgi-script</code>''.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>last|L</code></strong>'
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh (<strong>l</strong>ast rule)<br />
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh Stop the rewriting process here and don't apply any more
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh rewriting rules. This corresponds to the Perl
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>last</code> command or the <code>break</code> command
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh from the C language. Use this flag to prevent the currently
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rewritten URL from being rewritten further by following
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rules. For example, use it to rewrite the root-path URL
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ('<code>/</code>') to a real one, <em>e.g.</em>,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<code>/e/www/</code>'.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>next|N</code></strong>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>n</strong>ext round)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Re-run the rewriting process (starting again with the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh first rewriting rule). Here the URL to match is again not
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the original URL but the URL from the last rewriting rule.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This corresponds to the Perl <code>next</code> command or
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the <code>continue</code> command from the C language. Use
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh this flag to restart the rewriting process, <em>i.e.</em>,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh to immediately go to the top of the loop.<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>But be careful not to create an infinite
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh loop!</strong></li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>nocase|NC</code></strong>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>n</strong>o <strong>c</strong>ase)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This makes the <em>Pattern</em> case-insensitive,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>i.e.</em>, there is no difference between 'A-Z' and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh 'a-z' when <em>Pattern</em> is matched against the current
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh URL.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<strong><code>noescape|NE</code></strong>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>n</strong>o URI <strong>e</strong>scaping of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh output)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This flag keeps mod_rewrite from applying the usual URI
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh escaping rules to the result of a rewrite. Ordinarily,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh special characters (such as '%', '$', ';', and so on)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh will be escaped into their hexcode equivalents ('%25',
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '%24', and '%3B', respectively); this flag prevents this
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh from being done. This allows percent symbols to appear in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the output, as in
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh which would turn '<code>/foo/zed</code>' into a safe
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh request for '<code>/bar?arg=P1=zed</code>'.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<strong><code>nosubreq|NS</code></strong>' (used only if
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>n</strong>o internal
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>s</strong>ub-request)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This flag forces the rewriting engine to skip a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rewriting rule if the current request is an internal
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh sub-request. For instance, sub-requests occur internally
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh in Apache when <code>mod_include</code> tries to find out
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh information about possible directory default files
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<code>index.xxx</code>). On sub-requests it is not
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh always useful and even sometimes causes a failure to if
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the complete set of rules are applied. Use this flag to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh exclude some rules.<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Use the following rule for your decision: whenever you
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh prefix some URLs with CGI-scripts to force them to be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh processed by the CGI-script, the chance is high that you
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh will run into problems (or even overhead) on
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh sub-requests. In these cases, use this flag.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<strong><code>proxy|P</code></strong>' (force
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>p</strong>roxy)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This flag forces the substitution part to be internally
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh forced as a proxy request and immediately (<em>i.e.</em>,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rewriting rule processing stops here) put through the <a href="mod_proxy.html">proxy module</a>. You have to make
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh sure that the substitution string is a valid URI
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<em>e.g.</em>, typically starting with
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>http://</code><em>hostname</em>) which can be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh handled by the Apache proxy module. If not you get an
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh error from the proxy module. Use this flag to achieve a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh more powerful implementation of the <a href="mod_proxy.html#proxypass">ProxyPass</a> directive,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh to map some remote stuff into the namespace of the local
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh server.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Notice: To use this functionality make sure you have
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the proxy module compiled into your Apache server
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh program. If you don't know please check whether
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>mod_proxy.c</code> is part of the ``<code>httpd
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh -l</code>'' output. If yes, this functionality is
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh available to mod_rewrite. If not, then you first have to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh rebuild the <code class="program"><a href="/programs/httpd.html">httpd</a></code> program with mod_proxy
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh enabled.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<strong><code>passthrough|PT</code></strong>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>p</strong>ass <strong>t</strong>hrough to next
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh handler)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This flag forces the rewriting engine to set the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>uri</code> field of the internal
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>request_rec</code> structure to the value of the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>filename</code> field. This flag is just a hack to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh be able to post-process the output of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>RewriteRule</code> directives by
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>Alias</code>, <code>ScriptAlias</code>,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>Redirect</code>, <em>etc.</em> directives from
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh other URI-to-filename translators. A trivial example to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh show the semantics: If you want to rewrite
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/abc</code> to <code>/def</code> via the rewriting
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh engine of <code>mod_rewrite</code> and then
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/def</code> to <code>/ghi</code> with
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>mod_alias</code>:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh RewriteRule ^/abc(.*) /def$1 [PT]<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Alias /def /ghi
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh If you omit the <code>PT</code> flag then
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>mod_rewrite</code> will do its job fine,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>i.e.</em>, it rewrites <code>uri=/abc/...</code> to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>filename=/def/...</code> as a full API-compliant
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh URI-to-filename translator should do. Then
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>mod_alias</code> comes and tries to do a
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh URI-to-filename transition which will not work.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>Note: <strong>You have to use this flag if you want to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh intermix directives of different modules which contain
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh URL-to-filename translators</strong>. The typical example
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh is the use of <code>mod_alias</code> and
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>mod_rewrite</code>..</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>qsappend|QSA</code></strong>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>q</strong>uery <strong>s</strong>tring
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>a</strong>ppend)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This flag forces the rewriting engine to append a query
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh string part in the substitution string to the existing one
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh instead of replacing it. Use this when you want to add more
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh data to the query string via a rewrite rule.</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>redirect|R</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh [=<em>code</em>]</strong>' (force <a id="redirect" name="redirect"><strong>r</strong>edirect</a>)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Prefix <em>Substitution</em> with
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>http://thishost[:thisport]/</code> (which makes the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh new URL a URI) to force a external redirection. If no
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>code</em> is given a HTTP response of 302 (MOVED
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh TEMPORARILY) is used. If you want to use other response
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh codes in the range 300-400 just specify them as a number
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh or use one of the following symbolic names:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>temp</code> (default), <code>permanent</code>,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>seeother</code>. Use it for rules which should
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh canonicalize the URL and give it back to the client,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>e.g.</em>, translate ``<code>/~</code>'' into
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<code>/u/</code>'' or always append a slash to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/u/</code><em>user</em>, etc.<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p><strong>Note:</strong> When you use this flag, make
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh sure that the substitution field is a valid URL! If not,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh you are redirecting to an invalid location! And remember
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh that this flag itself only prefixes the URL with
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>http://thishost[:thisport]/</code>, rewriting
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh continues. Usually you also want to stop and do the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh redirection immediately. To stop the rewriting you also
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh have to provide the 'L' flag.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>'<strong><code>skip|S</code></strong>=<em>num</em>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<strong>s</strong>kip next rule(s))<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh This flag forces the rewriting engine to skip the next
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>num</em> rules in sequence when the current rule
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh matches. Use this to make pseudo if-then-else constructs:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh The last rule of the then-clause becomes
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>skip=N</code> where N is the number of rules in the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh else-clause. (This is <strong>not</strong> the same as the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh 'chain|C' flag!)</li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh '<strong><code>type|T</code></strong>=<em>MIME-type</em>'
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (force MIME <strong>t</strong>ype)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh Force the MIME-type of the target file to be
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>MIME-type</em>. For instance, this can be used to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh setup the content-type based on some conditions.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh For example, the following snippet allows <code>.php</code> files to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh be <em>displayed</em> by <code>mod_php</code> if they are called with
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh the <code>.phps</code> extension:
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <div class="example"><p><code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </code></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </li>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </ul>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>Note</h3> Never forget that <em>Pattern</em> is
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohapplied to a complete URL in per-server configuration
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohfiles. <strong>But in per-directory configuration files, the
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohper-directory prefix (which always is the same for a specific
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohdirectory!) is automatically <em>removed</em> for the pattern matching
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohand automatically <em>added</em> after the substitution has been
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohdone.</strong> This feature is essential for many sorts of rewriting,
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohbecause without this prefix stripping you have to match the parent
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohdirectory which is not always possible.
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>There is one exception: If a substitution string
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh starts with ``<code>http://</code>'' then the directory
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh prefix will <strong>not</strong> be added and an
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh external redirect or proxy throughput (if flag
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>P</strong> is used!) is forced!</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><h3>Note</h3>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh To enable the rewriting engine
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh for per-directory configuration files you need to set
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh ``<code>RewriteEngine On</code>'' in these files
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <strong>and</strong> ``<code>Options
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh FollowSymLinks</code>'' must be enabled. If your
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh administrator has disabled override of
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>FollowSymLinks</code> for a user's directory, then
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh you cannot use the rewriting engine. This restriction is
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh needed for security reasons.
9f82a7343f0a2f0721e0e0e1e881b06739003506humbedooh</div>
9f82a7343f0a2f0721e0e0e1e881b06739003506humbedooh
9f82a7343f0a2f0721e0e0e1e881b06739003506humbedooh <p>Here are all possible substitution combinations and their
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh meanings:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p><strong>Inside per-server configuration
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<code>httpd.conf</code>)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh for request ``<code>GET
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh /somepath/pathinfo</code>'':</strong><br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<strong>Given Rule</strong> <strong>Resulting Substitution</strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh---------------------------------------------- ----------------------------------
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) otherpath$1 not supported, because invalid!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) otherpath$1 [R] not supported, because invalid!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) otherpath$1 [P] not supported, because invalid!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh---------------------------------------------- ----------------------------------
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) /otherpath$1 /otherpath/pathinfo
5408def46d326118d1a65a93a86b646008ed01e1humbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh^/somepath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh via external redirection
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh
9a76f548bf4b14aaf2e6cbf886851a630e3e2fefhumbedooh^/somepath(.*) /otherpath$1 [P] not supported, because silly!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh---------------------------------------------- ----------------------------------
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via external redirection
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) http://thishost/otherpath$1 [P] not supported, because silly!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh---------------------------------------------- ----------------------------------
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via external redirection
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
7c46931efadad26fbfbf0698d8091f34852086aahumbedooh^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via external redirection
7c46931efadad26fbfbf0698d8091f34852086aahumbedooh (the [R] flag is redundant)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
7c46931efadad26fbfbf0698d8091f34852086aahumbedooh via internal proxy
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p><strong>Inside per-directory configuration for
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/somepath</code><br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (<em>i.e.</em>, file <code>.htaccess</code> in dir
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/physical/path/to/somepath</code> containing
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>RewriteBase /somepath</code>)<br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh for request ``<code>GET
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh /somepath/localpath/pathinfo</code>'':</strong><br />
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="note"><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<strong>Given Rule</strong> <strong>Resulting Substitution</strong>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh---------------------------------------------- ----------------------------------
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) otherpath$1 /somepath/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) otherpath$1 [R] http://thishost/somepath/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via external redirection
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) otherpath$1 [P] not supported, because silly!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh---------------------------------------------- ----------------------------------
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) /otherpath$1 /otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via external redirection
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) /otherpath$1 [P] not supported, because silly!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh---------------------------------------------- ----------------------------------
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via external redirection
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) http://thishost/otherpath$1 [P] not supported, because silly!
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh---------------------------------------------- ----------------------------------
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via external redirection
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via external redirection
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh (the [R] flag is redundant)
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh via internal proxy
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p><strong>Example:</strong></p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>We want to rewrite URLs of the form </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p class="indent">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/</code> <em>Language</em> <code>/~</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>Realname</em> <code>/.../</code> <em>File</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>into </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p class="indent">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/u/</code> <em>Username</em> <code>/.../</code>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <em>File</em> <code>.</code> <em>Language</em>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh </p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <p>We take the rewrite mapfile from above and save it under
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh <code>/path/to/file/map.txt</code>. Then we only have to
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh add the following lines to the Apache server configuration
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh file:</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="example"><pre>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteLog /path/to/file/rewrite.log
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteMap real-to-user txt:/path/to/file/map.txt
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedoohRewriteRule ^/([^/]+)/~([^/]+)/(.*)$ /u/${real-to-user:$2|nobody}/$3.$1
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</pre></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<div class="bottomlang">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<p><span>Available Languages: </span><a href="/en/mod/mod_rewrite.html" title="English">&nbsp;en&nbsp;</a></p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</div><div id="footer">
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<p class="apache">Copyright 1995-2005 The Apache Software Foundation or its licensors, as applicable.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="/faq/">FAQ</a> | <a href="/glossary.html">Glossary</a> | <a href="/sitemap.html">Sitemap</a></p></div>
c955b5a85313893f7bf55aaa5aacbd946cb41570humbedooh</body></html>