mod_rewrite.html.en revision e00def5e805da9a73b72ad25dac664f0c8c36c2e
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<?xml version="1.0" encoding="ISO-8859-1"?>
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick This file is generated from xml source: DO NOT EDIT
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick -->
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<title>mod_rewrite - Apache HTTP Server</title>
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<link href="/images/favicon.ico" rel="shortcut icon" /></head>
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<body>
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<div id="page-header">
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<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>
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<p class="apache">Apache HTTP Server Version 2.3</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<img alt="" src="/images/feather.gif" /></div>
fb18194cd0e59b737cc179eb2354a2dcd16087d4trawick<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div id="path">
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<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/">Documentation</a> &gt; <a href="../">Version 2.3</a> &gt; <a href="./">Modules</a></div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div id="page-content">
61a4b32b1032d530e84e1131cb803f803acf7461trawick<div id="preamble"><h1>Apache Module mod_rewrite</h1>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<div class="toplang">
61a4b32b1032d530e84e1131cb803f803acf7461trawick<p><span>Available Languages: </span><a href="/en/mod/mod_rewrite.html" title="English">&nbsp;en&nbsp;</a></p>
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick</div>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Provides a rule-based rewriting engine to rewrite requested
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickURLs on the fly</td></tr>
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick<tr><th><a href="module-dict.html#Status">Status:</a></th><td>Extension</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="module-dict.html#ModuleIdentifier">Module�Identifier:</a></th><td>rewrite_module</td></tr>
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick<tr><th><a href="module-dict.html#SourceFile">Source�File:</a></th><td>mod_rewrite.c</td></tr>
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick<tr><th><a href="module-dict.html#Compatibility">Compatibility:</a></th><td>Available in Apache 1.3 and later</td></tr></table>
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick<h3>Summary</h3>
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick <p>This module uses a rule-based rewriting engine (based on a
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick regular-expression parser) to rewrite requested URLs on the
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick fly. It supports an unlimited number of rules and an
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick unlimited number of attached rule conditions for each rule, to
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick provide a really flexible and powerful URL manipulation
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick mechanism. The URL manipulations can depend on various tests,
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick of server variables, environment variables, HTTP
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick headers, or time stamps. Even external database lookups in
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick various formats can be used to achieve highly granular URL
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick matching.</p>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick <p>This module operates on the full URLs (including the
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick path-info part) both in per-server context
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick (<code>httpd.conf</code>) and per-directory context
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick (<code>.htaccess</code>) and can generate query-string
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick parts on result. The rewritten result can lead to internal
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick sub-processing, external request redirection or even to an
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick internal proxy throughput.</p>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <p>Further details, discussion, and examples, are provided in the
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <a href="/rewrite/">detailed mod_rewrite documentation</a>.</p>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick</div>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<div id="quickview"><h3 class="directives">Directives</h3>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<ul id="toc">
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<li><img alt="" src="/images/down.gif" /> <a href="#rewritebase">RewriteBase</a></li>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<li><img alt="" src="/images/down.gif" /> <a href="#rewritecond">RewriteCond</a></li>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<li><img alt="" src="/images/down.gif" /> <a href="#rewriteengine">RewriteEngine</a></li>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<li><img alt="" src="/images/down.gif" /> <a href="#rewritelock">RewriteLock</a></li>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<li><img alt="" src="/images/down.gif" /> <a href="#rewritelog">RewriteLog</a></li>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<li><img alt="" src="/images/down.gif" /> <a href="#rewriteloglevel">RewriteLogLevel</a></li>
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick<li><img alt="" src="/images/down.gif" /> <a href="#rewritemap">RewriteMap</a></li>
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick<li><img alt="" src="/images/down.gif" /> <a href="#rewriteoptions">RewriteOptions</a></li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<li><img alt="" src="/images/down.gif" /> <a href="#rewriterule">RewriteRule</a></li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</ul>
798cfee8074b529042079c77eee6962a723350detrawick<h3>Topics</h3>
798cfee8074b529042079c77eee6962a723350detrawick<ul id="topics">
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick<li><img alt="" src="/images/down.gif" /> <a href="#quoting">Quoting Special Characters</a></li>
798cfee8074b529042079c77eee6962a723350detrawick<li><img alt="" src="/images/down.gif" /> <a href="#EnvVar">Environment Variables</a></li>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<li><img alt="" src="/images/down.gif" /> <a href="#vhosts">Rewriting in Virtual Hosts</a></li>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<li><img alt="" src="/images/down.gif" /> <a href="#Solutions">Practical Solutions</a></li>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick</ul></div>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<div class="section">
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick<h2><a name="quoting" id="quoting">Quoting Special Characters</a></h2>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <p>As of Apache 1.3.20, special characters in
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <em>TestString</em> and <em>Substitution</em> strings can be
61a4b32b1032d530e84e1131cb803f803acf7461trawick escaped (that is, treated as normal characters without their
61a4b32b1032d530e84e1131cb803f803acf7461trawick usual special meaning) by prefixing them with a slash ('\')
61a4b32b1032d530e84e1131cb803f803acf7461trawick character. In other words, you can include an actual
61a4b32b1032d530e84e1131cb803f803acf7461trawick dollar-sign character in a <em>Substitution</em> string by
61a4b32b1032d530e84e1131cb803f803acf7461trawick using '<code>\$</code>'; this keeps mod_rewrite from trying
61a4b32b1032d530e84e1131cb803f803acf7461trawick to treat it as a backreference.</p>
61a4b32b1032d530e84e1131cb803f803acf7461trawick</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<div class="section">
61a4b32b1032d530e84e1131cb803f803acf7461trawick<h2><a name="EnvVar" id="EnvVar">Environment Variables</a></h2>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
61a4b32b1032d530e84e1131cb803f803acf7461trawick <p>This module keeps track of two additional (non-standard)
61a4b32b1032d530e84e1131cb803f803acf7461trawick CGI/SSI environment variables named <code>SCRIPT_URL</code>
61a4b32b1032d530e84e1131cb803f803acf7461trawick and <code>SCRIPT_URI</code>. These contain the
61a4b32b1032d530e84e1131cb803f803acf7461trawick <em>logical</em> Web-view to the current resource, while the
61a4b32b1032d530e84e1131cb803f803acf7461trawick standard CGI/SSI variables <code>SCRIPT_NAME</code> and
61a4b32b1032d530e84e1131cb803f803acf7461trawick <code>SCRIPT_FILENAME</code> contain the <em>physical</em>
61a4b32b1032d530e84e1131cb803f803acf7461trawick System-view. </p>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
61a4b32b1032d530e84e1131cb803f803acf7461trawick <p>Notice: These variables hold the URI/URL <em>as they were
61a4b32b1032d530e84e1131cb803f803acf7461trawick initially requested</em>, that is, <em>before</em> any
61a4b32b1032d530e84e1131cb803f803acf7461trawick rewriting. This is important to note because the rewriting process is
61a4b32b1032d530e84e1131cb803f803acf7461trawick primarily used to rewrite logical URLs to physical
61a4b32b1032d530e84e1131cb803f803acf7461trawick pathnames.</p>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
61a4b32b1032d530e84e1131cb803f803acf7461trawick<div class="example"><h3>Example</h3><pre>
61a4b32b1032d530e84e1131cb803f803acf7461trawickSCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
61a4b32b1032d530e84e1131cb803f803acf7461trawickSCRIPT_FILENAME=/u/rse/.www/index.html
61a4b32b1032d530e84e1131cb803f803acf7461trawickSCRIPT_URL=/u/rse/
61a4b32b1032d530e84e1131cb803f803acf7461trawickSCRIPT_URI=http://en1.engelschall.com/u/rse/
61a4b32b1032d530e84e1131cb803f803acf7461trawick</pre></div>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
61a4b32b1032d530e84e1131cb803f803acf7461trawick</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<div class="section">
61a4b32b1032d530e84e1131cb803f803acf7461trawick<h2><a name="vhosts" id="vhosts">Rewriting in Virtual Hosts</a></h2>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
61a4b32b1032d530e84e1131cb803f803acf7461trawick <p>By default, <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> configuration
61a4b32b1032d530e84e1131cb803f803acf7461trawick settings from the main server context are not inherited by
61a4b32b1032d530e84e1131cb803f803acf7461trawick virtual hosts. To make the main server settings apply to virtual
61a4b32b1032d530e84e1131cb803f803acf7461trawick hosts, you must place the following directives in each <code class="directive"><a href="/mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code> section:</p>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
61a4b32b1032d530e84e1131cb803f803acf7461trawick <div class="example"><p><code>
61a4b32b1032d530e84e1131cb803f803acf7461trawick RewriteEngine On<br />
61a4b32b1032d530e84e1131cb803f803acf7461trawick RewriteOptions Inherit
61a4b32b1032d530e84e1131cb803f803acf7461trawick </code></p></div>
61a4b32b1032d530e84e1131cb803f803acf7461trawick</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<div class="section">
61a4b32b1032d530e84e1131cb803f803acf7461trawick<h2><a name="Solutions" id="Solutions">Practical Solutions</a></h2>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
61a4b32b1032d530e84e1131cb803f803acf7461trawick <p>For numerous examples of common, and not-so-common, uses for
61a4b32b1032d530e84e1131cb803f803acf7461trawick mod_rewrite, see the <a href="/rewrite/rewrite_guide.html">Rewrite
61a4b32b1032d530e84e1131cb803f803acf7461trawick Guide</a>, and the <a href="/rewrite/rewrite_guide_advanced.html">Advanced Rewrite
61a4b32b1032d530e84e1131cb803f803acf7461trawick Guide</a> documents.</p>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
61a4b32b1032d530e84e1131cb803f803acf7461trawick</div>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<div class="directive-section"><h2><a name="RewriteBase" id="RewriteBase">RewriteBase</a> <a name="rewritebase" id="rewritebase">Directive</a></h2>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<table class="directive">
61a4b32b1032d530e84e1131cb803f803acf7461trawick<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the base URL for per-directory rewrites</td></tr>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteBase <em>URL-path</em></code></td></tr>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>See usage for information.</code></td></tr>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>directory, .htaccess</td></tr>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
61a4b32b1032d530e84e1131cb803f803acf7461trawick<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</table>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <p>The <code class="directive">RewriteBase</code> directive explicitly
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick sets the base URL for per-directory rewrites. As you will see
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick below, <code class="directive"><a href="#rewriterule">RewriteRule</a></code>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick can be used in per-directory config files
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick (<code>.htaccess</code>). In such a case, it will act locally,
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick stripping the local directory prefix before processing, and applying
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick rewrite rules only to the remainder. When processing is complete, the
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick prefix is automatically added back to the
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick path. The default setting is; <code class="directive">RewriteBase</code> <em>physical-directory-path</em></p>
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick <p>When a substitution occurs for a new URL, this module has
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick to re-inject the URL into the server processing. To be able
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick to do this it needs to know what the corresponding URL-prefix
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick or URL-base is. By default this prefix is the corresponding
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick filepath itself. <strong>However, for most websites, URLs are NOT
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick directly related to physical filename paths, so this
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick assumption will often be wrong!</strong> Therefore, you can
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick use the <code>RewriteBase</code> directive to specify the
cf30286e95bd9b293bb4e3d5e4b89ed9d51d7a3ftrawick correct URL-prefix.</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<div class="note"> If your webserver's URLs are <strong>not</strong> directly
1b7ea70f150ac2343f7086af4df0b81749885eb1trawickrelated to physical file paths, you will need to use
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<code class="directive">RewriteBase</code> in every <code>.htaccess</code>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawickfile where you want to use <code class="directive"><a href="#rewriterule">RewriteRule</a></code> directives.
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick</div>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <p> For example, assume the following per-directory config file:</p>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<div class="example"><pre>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick#
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick# /abc/def/.htaccess -- per-dir config file for directory /abc/def
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick# Remember: /abc/def is the physical path of /xyz, <em>i.e.</em>, the server
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick# has a 'Alias /xyz /abc/def' directive <em>e.g.</em>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick#
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawickRewriteEngine On
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick# let the server know that we were reached via /xyz and not
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick# via the physical path prefix /abc/def
1b7ea70f150ac2343f7086af4df0b81749885eb1trawickRewriteBase /xyz
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick# now the rewriting rules
1b7ea70f150ac2343f7086af4df0b81749885eb1trawickRewriteRule ^oldstuff\.html$ newstuff.html
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick</pre></div>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <p>In the above example, a request to
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <code>/xyz/oldstuff.html</code> gets correctly rewritten to
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick the physical file <code>/abc/def/newstuff.html</code>.</p>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<div class="note"><h3>For Apache Hackers</h3>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<p>The following list gives detailed information about
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick the internal processing steps:</p>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<pre>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawickRequest:
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick /xyz/oldstuff.html
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawickInternal Processing:
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick /xyz/oldstuff.html -&gt; /abc/def/oldstuff.html (per-server Alias)
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick /abc/def/oldstuff.html -&gt; /abc/def/newstuff.html (per-dir RewriteRule)
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick /abc/def/newstuff.html -&gt; /xyz/newstuff.html (per-dir RewriteBase)
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick /xyz/newstuff.html -&gt; /abc/def/newstuff.html (per-server Alias)
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawickResult:
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick /abc/def/newstuff.html
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick</pre>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <p>This seems very complicated, but is in fact
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick correct Apache internal processing. Because the
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick per-directory rewriting comes late in the
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick process, the rewritten request
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick has to be re-injected into the Apache kernel.
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick This is not the serious overhead it may seem to be -
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick this re-injection is completely internal to the
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick Apache server (and the same procedure is used by
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick many other operations within Apache).</p>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick</div>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick</div>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<div class="directive-section"><h2><a name="RewriteCond" id="RewriteCond">RewriteCond</a> <a name="rewritecond" id="rewritecond">Directive</a></h2>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<table class="directive">
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Defines a condition under which rewriting will take place
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick</td></tr>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code> RewriteCond
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <em>TestString</em> <em>CondPattern</em></code></td></tr>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick</table>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <p>The <code class="directive">RewriteCond</code> directive defines a
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick rule condition. One or more <code class="directive">RewriteCond</code>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick can precede a <code class="directive"><a href="#rewriterule">RewriteRule</a></code>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick directive. The following rule is then only used if both
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick the current state of the URI matches its pattern, <strong>and</strong> if these conditions are met.</p>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <p><em>TestString</em> is a string which can contain the
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick following expanded constructs in addition to plain text:</p>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <ul>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <strong>RewriteRule backreferences</strong>: These are
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick backreferences of the form <strong><code>$N</code></strong>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick (0 &lt;= N &lt;= 9), which provide access to the grouped
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick parts (in parentheses) of the pattern, from the
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <code>RewriteRule</code> which is subject to the current
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick set of <code>RewriteCond</code> conditions..
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick </li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <strong>RewriteCond backreferences</strong>: These are
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick backreferences of the form <strong><code>%N</code></strong>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick (1 &lt;= N &lt;= 9), which provide access to the grouped
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick parts (again, in parentheses) of the pattern, from the last matched
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <code>RewriteCond</code> in the current set
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick of conditions.
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick </li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <strong>RewriteMap expansions</strong>: These are
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick expansions of the form <strong><code>${mapname:key|default}</code></strong>.
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick See <a href="#mapfunc">the documentation for
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick RewriteMap</a> for more details.
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick </li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <strong>Server-Variables</strong>: These are variables of
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick the form
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <strong><code>%{</code> <em>NAME_OF_VARIABLE</em>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <code>}</code></strong>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick where <em>NAME_OF_VARIABLE</em> can be a string taken
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick from the following list:
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <table>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <tr>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <th>HTTP headers:</th> <th>connection &amp; request:</th> <th />
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick </tr>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <td>
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick HTTP_USER_AGENT<br />
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick HTTP_REFERER<br />
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick HTTP_COOKIE<br />
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick HTTP_FORWARDED<br />
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick HTTP_HOST<br />
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick HTTP_PROXY_CONNECTION<br />
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick HTTP_ACCEPT<br />
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick </td>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <td>
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick REMOTE_ADDR<br />
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick REMOTE_HOST<br />
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick REMOTE_PORT<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick REMOTE_USER<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick REMOTE_IDENT<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick REQUEST_METHOD<br />
8b69a6447203b4cbd4c063010092dbe931503644trawick SCRIPT_FILENAME<br />
8b69a6447203b4cbd4c063010092dbe931503644trawick PATH_INFO<br />
8b69a6447203b4cbd4c063010092dbe931503644trawick QUERY_STRING<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick AUTH_TYPE<br />
61a4b32b1032d530e84e1131cb803f803acf7461trawick </td>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <td />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick </tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <th>server internals:</th> <th>date and time:</th> <th>specials:</th>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick </tr>
61a4b32b1032d530e84e1131cb803f803acf7461trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <td>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick DOCUMENT_ROOT<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick SERVER_ADMIN<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick SERVER_NAME<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick SERVER_ADDR<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick SERVER_PORT<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick SERVER_PROTOCOL<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick SERVER_SOFTWARE<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick </td>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <td>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick TIME_YEAR<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick TIME_MON<br />
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick TIME_DAY<br />
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick TIME_HOUR<br />
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick TIME_MIN<br />
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick TIME_SEC<br />
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick TIME_WDAY<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick TIME<br />
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick </td>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick <td>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick API_VERSION<br />
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick THE_REQUEST<br />
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick REQUEST_URI<br />
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick REQUEST_FILENAME<br />
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick IS_SUBREQ<br />
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick HTTPS<br />
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick </td>
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick </tr>
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick </table>
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick <p>These variables all
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick correspond to the similarly named HTTP
a7b9ea00b96407cc3c1f3660162b3cb4918af396trawick MIME-headers, C variables of the Apache server or
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>struct tm</code> fields of the Unix system.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick Most are documented elsewhere in the Manual or in
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick the CGI specification. Those that are special to
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick mod_rewrite include those below.</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <div class="note">
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dl>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dt><code>IS_SUBREQ</code></dt>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dd>Will contain the text "true" if the request
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick currently being processed is a sub-request,
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick "false" otherwise. Sub-requests may be generated
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick by modules that need to resolve additional files
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick or URIs in order to complete their tasks.</dd>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick <dt><code>API_VERSION</code></dt>
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick <dd>This is the version of the Apache module API
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick (the internal interface between server and
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick module) in the current httpd build, as defined in
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick include/ap_mmn.h. The module API version
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick corresponds to the version of Apache in use (in
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick the release version of Apache 1.3.14, for
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick instance, it is 19990320:10), but is mainly of
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick interest to module authors.</dd>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dt><code>THE_REQUEST</code></dt>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dd>The full HTTP request line sent by the
61a4b32b1032d530e84e1131cb803f803acf7461trawick browser to the server (e.g., "<code>GET
61a4b32b1032d530e84e1131cb803f803acf7461trawick /index.html HTTP/1.1</code>"). This does not
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick include any additional headers sent by the
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick browser.</dd>
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick <dt><code>REQUEST_URI</code></dt>
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick <dd>The resource requested in the HTTP request
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick line. (In the example above, this would be
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick "/index.html".)</dd>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dt><code>REQUEST_FILENAME</code></dt>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dd>The full local filesystem path to the file or
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick script matching the request.</dd>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dt><code>HTTPS</code></dt>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <dd>Will contain the text "on" if the connection is
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick using SSL/TLS, or "off" otherwise. (This variable
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick can be safely used regardless of whether or not
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick <code class="module"><a href="/mod/mod_ssl.html">mod_ssl</a></code> is loaded).</dd>
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick </dl>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick </li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick </ul>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <p>Other things you should be aware of:</p>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <ol>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>The variables SCRIPT_FILENAME and REQUEST_FILENAME
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick contain the same value - the value of the
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <code>filename</code> field of the internal
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <code>request_rec</code> structure of the Apache server.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick The first name is the commonly known CGI variable name
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick while the second is the appropriate counterpart of
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick REQUEST_URI (which contains the value of the
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>uri</code> field of <code>request_rec</code>).</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick <li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>%{ENV:variable}</code>, where <em>variable</em> can be
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick any environment variable, is also available.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick This is looked-up via internal
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick Apache structures and (if not found there) via
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>getenv()</code> from the Apache server process.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <code>%{SSL:variable}</code>, where <em>variable</em> is the
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick name of an <a href="mod_ssl.html#envvars">SSL environment
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick variable</a>, can be used whether or not
e6114dbc138189372015ea6ed63bc757645922a7trawick <code class="module"><a href="/mod/mod_ssl.html">mod_ssl</a></code> is loaded, but will always expand to
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick the empty string if it is not. Example:
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <code>128</code>.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>%{HTTP:header}</code>, where <em>header</em> can be
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick any HTTP MIME-header name, can always be used to obtain the
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick value of a header sent in the HTTP request.
798cfee8074b529042079c77eee6962a723350detrawick Example: <code>%{HTTP:Proxy-Connection}</code> is
798cfee8074b529042079c77eee6962a723350detrawick the value of the HTTP header
798cfee8074b529042079c77eee6962a723350detrawick ``<code>Proxy-Connection:</code>''.
798cfee8074b529042079c77eee6962a723350detrawick <p>If a HTTP header is used in a condition this header is added to
798cfee8074b529042079c77eee6962a723350detrawick the Vary header of the response in case the condition evaluates to
798cfee8074b529042079c77eee6962a723350detrawick to true for the request. It is <strong>not</strong> added if the
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick condition evaluates to false for the request. Adding the HTTP header
798cfee8074b529042079c77eee6962a723350detrawick to the Vary header of the response is needed for proper caching.</p>
798cfee8074b529042079c77eee6962a723350detrawick <p>It has to be kept in mind that conditions follow a short circuit
798cfee8074b529042079c77eee6962a723350detrawick logic in the case of the '<strong><code>ornext|OR</code></strong>' flag
798cfee8074b529042079c77eee6962a723350detrawick so that certain conditions might not be evaluated at all.</p></li>
798cfee8074b529042079c77eee6962a723350detrawick
798cfee8074b529042079c77eee6962a723350detrawick <li>
798cfee8074b529042079c77eee6962a723350detrawick <code>%{LA-U:variable}</code> can be used for look-aheads which perform
798cfee8074b529042079c77eee6962a723350detrawick an internal (URL-based) sub-request to determine the final
798cfee8074b529042079c77eee6962a723350detrawick value of <em>variable</em>. This can be used to access
798cfee8074b529042079c77eee6962a723350detrawick variable for rewriting which is not available at the current
798cfee8074b529042079c77eee6962a723350detrawick stage, but will be set in a later phase.
798cfee8074b529042079c77eee6962a723350detrawick <p>For instance, to rewrite according to the
798cfee8074b529042079c77eee6962a723350detrawick <code>REMOTE_USER</code> variable from within the
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick per-server context (<code>httpd.conf</code> file) you must
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick use <code>%{LA-U:REMOTE_USER}</code> - this
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick variable is set by the authorization phases, which come
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>after</em> the URL translation phase (during which mod_rewrite
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick operates).</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <p>On the other hand, because mod_rewrite implements
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick its per-directory context (<code>.htaccess</code> file) via
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick the Fixup phase of the API and because the authorization
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick phases come <em>before</em> this phase, you just can use
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>%{REMOTE_USER}</code> in that context.</p></li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>%{LA-F:variable}</code> can be used to perform an internal
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick (filename-based) sub-request, to determine the final value
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick of <em>variable</em>. Most of the time, this is the same as
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick LA-U above.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick </ol>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <p><em>CondPattern</em> is the condition pattern,
798cfee8074b529042079c77eee6962a723350detrawick a regular expression which is applied to the
798cfee8074b529042079c77eee6962a723350detrawick current instance of the <em>TestString</em>.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>TestString</em> is first evaluated, before being matched against
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>CondPattern</em>.</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <p><strong>Remember:</strong> <em>CondPattern</em> is a
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>perl compatible regular expression</em> with some
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick additions:</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <ol>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>You can prefix the pattern string with a
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick '<code>!</code>' character (exclamation mark) to specify a
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <strong>non</strong>-matching pattern.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick There are some special variants of <em>CondPatterns</em>.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick Instead of real regular expression strings you can also
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick use one of the following:
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <ul>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>'<strong>&lt;CondPattern</strong>' (lexicographically
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick precedes)<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick Treats the <em>CondPattern</em> as a plain string and
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick compares it lexicographically to <em>TestString</em>. True if
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>TestString</em> lexicographically precedes
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>CondPattern</em>.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>'<strong>&gt;CondPattern</strong>' (lexicographically
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick follows)<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick Treats the <em>CondPattern</em> as a plain string and
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick compares it lexicographically to <em>TestString</em>. True if
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>TestString</em> lexicographically follows
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>CondPattern</em>.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>'<strong>=CondPattern</strong>' (lexicographically
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick equal)<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick Treats the <em>CondPattern</em> as a plain string and
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick compares it lexicographically to <em>TestString</em>. True if
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>TestString</em> is lexicographically equal to
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>CondPattern</em> (the two strings are exactly
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick equal, character for character). If <em>CondPattern</em>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick is <code>""</code> (two quotation marks) this
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick compares <em>TestString</em> to the empty string.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>'<strong>-d</strong>' (is
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <strong>d</strong>irectory)<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick Treats the <em>TestString</em> as a pathname and tests
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick whether or not it exists, and is a directory.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick <li>'<strong>-f</strong>' (is regular
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick <strong>f</strong>ile)<br />
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick Treats the <em>TestString</em> as a pathname and tests
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick whether or not it exists, and is a regular file.</li>
8b69a6447203b4cbd4c063010092dbe931503644trawick
8b69a6447203b4cbd4c063010092dbe931503644trawick <li>'<strong>-s</strong>' (is regular file, with
8b69a6447203b4cbd4c063010092dbe931503644trawick <strong>s</strong>ize)<br />
8b69a6447203b4cbd4c063010092dbe931503644trawick Treats the <em>TestString</em> as a pathname and tests
8b69a6447203b4cbd4c063010092dbe931503644trawick whether or not it exists, and is a regular file with size greater
8b69a6447203b4cbd4c063010092dbe931503644trawick than zero.</li>
8b69a6447203b4cbd4c063010092dbe931503644trawick
8b69a6447203b4cbd4c063010092dbe931503644trawick <li>'<strong>-l</strong>' (is symbolic
8b69a6447203b4cbd4c063010092dbe931503644trawick <strong>l</strong>ink)<br />
8b69a6447203b4cbd4c063010092dbe931503644trawick Treats the <em>TestString</em> as a pathname and tests
8b69a6447203b4cbd4c063010092dbe931503644trawick whether or not it exists, and is a symbolic link.</li>
8b69a6447203b4cbd4c063010092dbe931503644trawick
8b69a6447203b4cbd4c063010092dbe931503644trawick <li>'<strong>-x</strong>' (has e<strong>x</strong>ecutable
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick permissions)<br />
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick Treats the <em>TestString</em> as a pathname and tests
f6ba728fd666800e11b36452f7ad76ec5fcff653trawick whether or not it exists, and has executable permissions.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick These permissions are determined according to
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick the underlying OS.</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>'<strong>-F</strong>' (is existing file, via
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick subrequest)<br />
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick Checks whether or not <em>TestString</em> is a valid file,
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick accessible via all the server's currently-configured
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick access controls for that path. This uses an internal
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick subrequest to do the check, so use it with care -
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick it can impact your server's performance!</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <li>'<strong>-U</strong>' (is existing URL, via
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick subrequest)<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick Checks whether or not <em>TestString</em> is a valid URL,
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick accessible via all the server's currently-configured
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick access controls for that path. This uses an internal
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick subrequest to do the check, so use it with care -
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick it can impact your server's performance!</li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick </ul>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="note"><h3>Note:</h3>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick All of these tests can
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick also be prefixed by an exclamation mark ('!') to
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick negate their meaning.
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick</div>
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick </li>
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick
4fb787199739239f1162e8ff35cbf42c9b452b8ftrawick <li>You can also set special flags for
4fb787199739239f1162e8ff35cbf42c9b452b8ftrawick <em>CondPattern</em> by appending
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick <strong><code>[</code><em>flags</em><code>]</code></strong>
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick as the third argument to the <code>RewriteCond</code>
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick directive, where <em>flags</em> is a comma-separated list of any of the
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick following flags:
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick <ul>
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick <li>'<strong><code>nocase|NC</code></strong>'
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick (<strong>n</strong>o <strong>c</strong>ase)<br />
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick This makes the test case-insensitive - differences
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick between 'A-Z' and 'a-z' are ignored, both in the
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick expanded <em>TestString</em> and the <em>CondPattern</em>.
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick This flag is effective only for comparisons between
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick <em>TestString</em> and <em>CondPattern</em>. It has no
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick effect on filesystem and subrequest checks.</li>
4fb787199739239f1162e8ff35cbf42c9b452b8ftrawick
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick <li>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick '<strong><code>ornext|OR</code></strong>'
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick (<strong>or</strong> next condition)<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick Use this to combine rule conditions with a local OR
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick instead of the implicit AND. Typical example:
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="example"><pre>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickRewriteCond %{REMOTE_HOST} ^host1.* [OR]
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickRewriteCond %{REMOTE_HOST} ^host2.* [OR]
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickRewriteCond %{REMOTE_HOST} ^host3.*
e6114dbc138189372015ea6ed63bc757645922a7trawickRewriteRule ...some special stuff for any of these hosts...
e6114dbc138189372015ea6ed63bc757645922a7trawick</pre></div>
e6114dbc138189372015ea6ed63bc757645922a7trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick Without this flag you would have to write the condition/rule
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick pair three times.
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick </li>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick <li>'<strong><code>novary|NV</code></strong>'
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick (<strong>n</strong>o <strong>v</strong>ary)<br />
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick If a HTTP header is used in the condition, this flag prevents
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick this header from being added to the Vary header of the response. <br />
e6114dbc138189372015ea6ed63bc757645922a7trawick Using this flag might break proper caching of the response if
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick the representation of this response varies on the value of this header.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick So this flag should be only used if the meaning of the Vary header
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick is well understood.
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick </li>
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick </ul>
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick </li>
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick </ol>
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick <p><strong>Example:</strong></p>
1f5a6b18eb1d06210b03a7c8ea7a07506f5949ddtrawick
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick <p>To rewrite the Homepage of a site according to the
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick ``<code>User-Agent:</code>'' header of the request, you can
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick use the following: </p>
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick<div class="example"><pre>
1f5a6b18eb1d06210b03a7c8ea7a07506f5949ddtrawickRewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawickRewriteRule ^/$ /homepage.max.html [L]
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickRewriteCond %{HTTP_USER_AGENT} ^Lynx.*
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawickRewriteRule ^/$ /homepage.min.html [L]
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
e6114dbc138189372015ea6ed63bc757645922a7trawickRewriteRule ^/$ /homepage.std.html [L]
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</pre></div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick <p>Explanation: If you use a browser which identifies itself
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick as 'Mozilla' (including Netscape Navigator, Mozilla etc), then you
e6114dbc138189372015ea6ed63bc757645922a7trawick get the max homepage (which could include frames, or other special
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick features).
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick If you use the Lynx browser (which is terminal-based), then
e6114dbc138189372015ea6ed63bc757645922a7trawick you get the min homepage (which could be a version designed for
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick easy, text-only browsing).
88c0d6d1cfdecfa8c2b6d7ae2482f06755cd7887trawick If neither of these conditions apply (you use any other browser,
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick or your browser identifies itself as something non-standard), you get
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick the std (standard) homepage.</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</div>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick<div class="directive-section"><h2><a name="RewriteEngine" id="RewriteEngine">RewriteEngine</a> <a name="rewriteengine" id="rewriteengine">Directive</a></h2>
1b7ea70f150ac2343f7086af4df0b81749885eb1trawick<table class="directive">
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Enables or disables runtime rewriting engine</td></tr>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteEngine on|off</code></td></tr>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>RewriteEngine off</code></td></tr>
d66e2366f1cceb0e2b107020fe61e36d090b6d9ctrawick<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</table>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <p>The <code class="directive">RewriteEngine</code> directive enables or
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick disables the runtime rewriting engine. If it is set to
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>off</code> this module does no runtime processing at
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick all. It does not even update the <code>SCRIPT_URx</code>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick environment variables.</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <p>Use this directive to disable the module instead of
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick commenting out all the <code class="directive"><a href="#rewriterule">RewriteRule</a></code> directives!</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
182d9b96e04124d14c9f539109fb4e8cbd360d36trawick <p>Note that rewrite configurations are not
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick inherited by virtual hosts. This means that you need to have a
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <code>RewriteEngine on</code> directive for each virtual host
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick in which you wish to use rewrite rules.</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="directive-section"><h2><a name="RewriteLock" id="RewriteLock">RewriteLock</a> <a name="rewritelock" id="rewritelock">Directive</a></h2>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<table class="directive">
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<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>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawicksynchronization</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteLock <em>file-path</em></code></td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config</td></tr>
8b69a6447203b4cbd4c063010092dbe931503644trawick<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
8b69a6447203b4cbd4c063010092dbe931503644trawick<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
8b69a6447203b4cbd4c063010092dbe931503644trawick</table>
8b69a6447203b4cbd4c063010092dbe931503644trawick <p>This directive sets the filename for a synchronization
8b69a6447203b4cbd4c063010092dbe931503644trawick lockfile which mod_rewrite needs to communicate with <code class="directive"><a href="#rewritemap">RewriteMap</a></code>
8b69a6447203b4cbd4c063010092dbe931503644trawick <em>programs</em>. Set this lockfile to a local path (not on a
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick NFS-mounted device) when you want to use a rewriting
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick map-program. It is not required for other types of rewriting
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick maps.</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</div>
82cfc46bc66803541d4a1436462268d6495d20b1trawick<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="directive-section"><h2><a name="RewriteLog" id="RewriteLog">RewriteLog</a> <a name="rewritelog" id="rewritelog">Directive</a></h2>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<table class="directive">
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the name of the file used for logging rewrite engine
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickprocessing</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteLog <em>file-path</em></code></td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</table>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <p>The <code class="directive">RewriteLog</code> directive sets the name
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick of the file to which the server logs any rewriting actions it
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick performs. If the name does not begin with a slash
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick ('<code>/</code>') then it is assumed to be relative to the
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>Server Root</em>. The directive should occur only once per
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick server config.</p>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="note"> To disable the logging of
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick rewriting actions it is not recommended to set
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>Filename</em> to <code>/dev/null</code>, because
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick although the rewriting engine does not then output to a
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick logfile it still creates the logfile output internally.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <strong>This will slow down the server with no advantage
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick to the administrator!</strong> To disable logging either
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick remove or comment out the <code class="directive">RewriteLog</code>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick directive or use <code>RewriteLogLevel 0</code>!
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="note"><h3>Security</h3>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickSee the <a href="/misc/security_tips.html">Apache Security Tips</a>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickdocument for details on how your security could be compromised if the
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickdirectory where logfiles are stored is writable by anyone other than
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickthe user that starts the server.
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="example"><h3>Example</h3><p><code>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawickRewriteLog "/usr/local/var/apache/logs/rewrite.log"
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</code></p></div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="directive-section"><h2><a name="RewriteLogLevel" id="RewriteLogLevel">RewriteLogLevel</a> <a name="rewriteloglevel" id="rewriteloglevel">Directive</a></h2>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<table class="directive">
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the verbosity of the log file used by the rewrite
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawickengine</td></tr>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteLogLevel <em>Level</em></code></td></tr>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>RewriteLogLevel 0</code></td></tr>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick</table>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <p>The <code class="directive">RewriteLogLevel</code> directive sets the
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick verbosity level of the rewriting logfile. The default level 0
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick means no logging, while 9 or more means that practically all
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick actions are logged.</p>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <p>To disable the logging of rewriting actions simply set
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <em>Level</em> to 0. This disables all rewrite action
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick logs.</p>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick<div class="note"> Using a high value for
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <em>Level</em> will slow down your Apache server
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick dramatically! Use the rewriting logfile at a
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <em>Level</em> greater than 2 only for debugging!
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick</div>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick<div class="example"><h3>Example</h3><p><code>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawickRewriteLogLevel 3
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick</code></p></div>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<div class="directive-section"><h2><a name="RewriteMap" id="RewriteMap">RewriteMap</a> <a name="rewritemap" id="rewritemap">Directive</a></h2>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<table class="directive">
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Defines a mapping function for key-lookup</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteMap <em>MapName</em> <em>MapType</em>:<em>MapSource</em>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick</code></td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>The choice of different dbm types is available in
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawickApache 2.0.41 and later</td></tr>
6500ceb45a2075fad36a0dc5c86a23858bf9c84etrawick</table>
1f576a0c7b9f39240f32f6061c05006dd6735f67trawick <p>The <code class="directive">RewriteMap</code> directive defines a
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>Rewriting Map</em> which can be used inside rule
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick substitution strings by the mapping-functions to
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick insert/substitute fields through a key lookup. The source of
a8002cb6eb5309086e06721eb2cdc20b891840fftrawick this lookup can be of various types.</p>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <p>The <a id="mapfunc" name="mapfunc"><em>MapName</em></a> is
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick the name of the map and will be used to specify a
a8002cb6eb5309086e06721eb2cdc20b891840fftrawick mapping-function for the substitution strings of a rewriting
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick rule via one of the following constructs:</p>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <p class="indent">
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <strong><code>${</code> <em>MapName</em> <code>:</code>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <em>LookupKey</em> <code>}</code><br />
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <code>${</code> <em>MapName</em> <code>:</code>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <em>LookupKey</em> <code>|</code> <em>DefaultValue</em>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <code>}</code></strong>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick </p>
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick <p>When such a construct occurs, the map <em>MapName</em> is
a63c98c28033ca762ca4dcbed6b3adef63580e7ctrawick consulted and the key <em>LookupKey</em> is looked-up. If the
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick key is found, the map-function construct is substituted by
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <em>SubstValue</em>. If the key is not found then it is
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick substituted by <em>DefaultValue</em> or by the empty string
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick if no <em>DefaultValue</em> was specified.</p>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <p>For example, you might define a
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <code class="directive">RewriteMap</code> as:</p>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <div class="example"><p><code>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick RewriteMap examplemap txt:/path/to/file/map.txt
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick </code></p></div>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <p>You would then be able to use this map in a
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <code class="directive">RewriteRule</code> as follows:</p>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <div class="example"><p><code>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick RewriteRule ^/ex/(.*) ${examplemap:$1}
e6114dbc138189372015ea6ed63bc757645922a7trawick </code></p></div>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick
e6114dbc138189372015ea6ed63bc757645922a7trawick <p>The following combinations for <em>MapType</em> and
e6114dbc138189372015ea6ed63bc757645922a7trawick <em>MapSource</em> can be used:</p>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick
e6114dbc138189372015ea6ed63bc757645922a7trawick <ul>
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <li>
e6114dbc138189372015ea6ed63bc757645922a7trawick <strong>Standard Plain Text</strong><br />
e6114dbc138189372015ea6ed63bc757645922a7trawick MapType: <code>txt</code>, MapSource: Unix filesystem
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick path to valid regular file
e6114dbc138189372015ea6ed63bc757645922a7trawick
4e2fbd7af73349caa41681acc2ec43d6d7011beatrawick <p>This is the standard rewriting map feature where the
fcd5c4e9e126e867eb270ed2d4138348cb1e46e5trawick <em>MapSource</em> is a plain ASCII file containing
either blank lines, comment lines (starting with a '#'
character) or pairs like the following - one per
line.</p>
<p class="indent">
<strong><em>MatchingKey</em>
<em>SubstValue</em></strong>
</p>
<div class="example"><h3>Example</h3><pre>
##
## map.txt -- rewriting map
##
Ralf.S.Engelschall rse # Bastard Operator From Hell
Mr.Joe.Average joe # Mr. Average
</pre></div>
<div class="example"><p><code>
RewriteMap real-to-user txt:/path/to/file/map.txt
</code></p></div>
</li>
<li>
<strong>Randomized Plain Text</strong><br />
MapType: <code>rnd</code>, MapSource: Unix filesystem
path to valid regular file
<p>This is identical to the Standard Plain Text variant
above but with a special post-processing feature: After
looking up a value it is parsed according to contained
``<code>|</code>'' characters which have the meaning of
``or''. In other words they indicate a set of
alternatives from which the actual returned value is
chosen randomly. For example, you might use the following map
file and directives to provide a random load balancing between
several back-end server, via a reverse-proxy. Images are sent
to one of the servers in the 'static' pool, while everything
else is sent to one of the 'dynamic' pool.</p>
<p>Example:</p>
<div class="example"><h3>Rewrite map file</h3><pre>
##
## map.txt -- rewriting map
##
static www1|www2|www3|www4
dynamic www5|www6
</pre></div>
<div class="example"><h3>Configuration directives</h3><p><code>
RewriteMap servers rnd:/path/to/file/map.txt<br />
<br />
RewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1
[NC,P,L]<br />
RewriteRule ^/(.*) http://${servers:dynamic}/$1 [P,L]
</code></p></div>
</li>
<li>
<strong>Hash File</strong><br /> MapType:
<code>dbm[=<em>type</em>]</code>, MapSource: Unix filesystem
path to valid regular file
<p>Here the source is a binary format DBM file containing
the same contents as a <em>Plain Text</em> format file, but
in a special representation which is optimized for really
fast lookups. The <em>type</em> can be sdbm, gdbm, ndbm, or
db depending on <a href="/install.html#dbm">compile-time
settings</a>. If the <em>type</em> is omitted, the
compile-time default will be chosen.</p>
<p>To create a dbm file from a source text file, use the <a href="/programs/httxt2dbm.html">httxt2dbm</a> utility.</p>
<div class="example"><p><code>
$ httxt2dbm -i mapfile.txt -o mapfile.map
</code></p></div>
</li>
<li>
<strong>Internal Function</strong><br />
MapType: <code>int</code>, MapSource: Internal Apache
function
<p>Here, the source is an internal Apache function.
Currently you cannot create your own, but the following
functions already exist:</p>
<ul>
<li><strong>toupper</strong>:<br />
Converts the key to all upper case.</li>
<li><strong>tolower</strong>:<br />
Converts the key to all lower case.</li>
<li><strong>escape</strong>:<br />
Translates special characters in the key to
hex-encodings.</li>
<li><strong>unescape</strong>:<br />
Translates hex-encodings in the key back to
special characters.</li>
</ul>
</li>
<li>
<strong>External Rewriting Program</strong><br />
MapType: <code>prg</code>, MapSource: Unix filesystem
path to valid regular file
<p>Here the source is a program, not a map file. To
create it you can use a language of your choice, but
the result has to be an executable program (either
object-code or a script with the magic cookie trick
'<code>#!/path/to/interpreter</code>' as the first
line).</p>
<p>This program is started once, when the Apache server
is started, and then communicates with the rewriting engine
via its <code>stdin</code> and <code>stdout</code>
file-handles. For each map-function lookup it will
receive the key to lookup as a newline-terminated string
on <code>stdin</code>. It then has to give back the
looked-up value as a newline-terminated string on
<code>stdout</code> or the four-character string
``<code>NULL</code>'' if it fails (<em>i.e.</em>, there
is no corresponding value for the given key). A trivial
program which will implement a 1:1 map (<em>i.e.</em>,
key == value) could be:</p>
<div class="example"><pre>
#!/usr/bin/perl
$| = 1;
while (&lt;STDIN&gt;) {
# ...put here any transformations or lookups...
print $_;
}
</pre></div>
<p>But be very careful:</p>
<ol>
<li>``<em>Keep it simple, stupid</em>'' (KISS).
If this program hangs, it will cause Apache to hang
when trying to use the relevant rewrite rule.</li>
<li>A common mistake is to use buffered I/O on
<code>stdout</code>. Avoid this, as it will cause a deadloop!
``<code>$|=1</code>'' is used above, to prevent this.</li>
<li>The <code class="directive"><a href="#rewritelock">RewriteLock</a></code> directive can
be used to define a lockfile which mod_rewrite can use to synchronize
communication with the mapping program. By default no such
synchronization takes place.</li>
</ol>
</li>
<li>
<p><strong>SQL Query</strong><br />
MapType: <code>dbd</code> or <code>fastdbd</code>,
MapSource: An SQL SELECT statement that takes a single
argument and returns a single value.</p>
<p>This uses <code class="module"><a href="/mod/mod_dbd.html">mod_dbd</a></code> to implement a rewritemap
by lookup in an SQL database. There are two forms:
<code>fastdbd</code> caches database lookups internally,
<code>dbd</code> doesn't. So <code>dbd</code> incurs a
performance penalty but responds immediately if the database
contents are updated, while <code>fastdbd</code> is more
efficient but won't re-read database contents until server
restart.</p>
<p>If a query returns more than one row, a random row from
the result set is used.</p>
<div class="example"><h3>Example</h3><p><code>
RewriteMap myquery "fastdbd:SELECT destination FROM rewrite WHERE source = %s"
</code></p></div>
</li>
</ul>
<p>The <code class="directive">RewriteMap</code> directive can occur more than
once. For each mapping-function use one
<code class="directive">RewriteMap</code> directive to declare its rewriting
mapfile. While you cannot <strong>declare</strong> a map in
per-directory context it is of course possible to
<strong>use</strong> this map in per-directory context. </p>
<div class="note"><h3>Note</h3> For plain text and DBM format files the
looked-up keys are cached in-core until the <code>mtime</code> of the
mapfile changes or the server does a restart. This way you can have
map-functions in rules which are used for <strong>every</strong>
request. This is no problem, because the external lookup only happens
once!
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="RewriteOptions" id="RewriteOptions">RewriteOptions</a> <a name="rewriteoptions" id="rewriteoptions">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets some special options for the rewrite engine</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteOptions <var>Options</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td><code>MaxRedirects</code> is no longer available in version 2.1 and
later</td></tr>
</table>
<p>The <code class="directive">RewriteOptions</code> directive sets some
special options for the current per-server or per-directory
configuration. The <em>Option</em> string can currently
only be one of the following:</p>
<dl>
<dt><code>inherit</code></dt>
<dd>This forces the current configuration to inherit the
configuration of the parent. In per-virtual-server context,
this means that the maps, conditions and rules of the main
server are inherited. In per-directory context this means
that conditions and rules of the parent directory's
<code>.htaccess</code> configuration are inherited.</dd>
</dl>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="RewriteRule" id="RewriteRule">RewriteRule</a> <a name="rewriterule" id="rewriterule">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Defines rules for the rewriting engine</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>RewriteRule
<em>Pattern</em> <em>Substitution</em> [<em>flags</em>]</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_rewrite</td></tr>
</table>
<p>The <code class="directive">RewriteRule</code> directive is the real
rewriting workhorse. The directive can occur more than once,
with each instance defining a single rewrite rule. The
order in which these rules are defined is important - this is the order
in which they will be applied at run-time.</p>
<p><a id="patterns" name="patterns"><em>Pattern</em></a> is
a perl compatible <a id="regexp" name="regexp">regular
expression</a>. On the first RewriteRule it is applied to the
<a href="/directive-dict.html#Syntax">URL-path</a> of the request;
subsequent patterns are applied to the output of the last matched
RewriteRule.</p>
<div class="note"><h3>What is matched?</h3>
<p>The <em>Pattern</em> will initially be matched against the part of the
URL after the hostname and port, and before the query string. If you wish
to match against the hostname, port, or query string, use a
<code class="directive"><a href="#rewritecond">RewriteCond</a></code> with the
<code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, or
<code>%{QUERY_STRING}</code> variables respectively.</p>
</div>
<p>Some hints on the syntax of <a class="glossarylink" href="/glossary.html#regex" title="see glossary">regular
expressions</a>:</p>
<div class="note"><pre>
<strong>Text:</strong>
<strong><code>.</code></strong> Any single character
<strong><code>[</code></strong>chars<strong><code>]</code></strong> Character class: Any character of the class ``chars''
<strong><code>[^</code></strong>chars<strong><code>]</code></strong> Character class: Not a character of the class ``chars''
text1<strong><code>|</code></strong>text2 Alternative: text1 or text2
<strong>Quantifiers:</strong>
<strong><code>?</code></strong> 0 or 1 occurrences of the preceding text
<strong><code>*</code></strong> 0 or N occurrences of the preceding text (N &gt; 0)
<strong><code>+</code></strong> 1 or N occurrences of the preceding text (N &gt; 1)
<strong>Grouping:</strong>
<strong><code>(</code></strong>text<strong><code>)</code></strong> Grouping of text
(used either to set the borders of an alternative as above, or
to make backreferences, where the <strong>N</strong>th group can
be referred to on the RHS of a RewriteRule as <code>$</code><strong>N</strong>)
<strong>Anchors:</strong>
<strong><code>^</code></strong> Start-of-line anchor
<strong><code>$</code></strong> End-of-line anchor
<strong>Escaping:</strong>
<strong><code>\</code></strong>char escape the given char
(for instance, to specify the chars "<code>.[]()</code>" <em>etc.</em>)
</pre></div>
<p>For more information about regular expressions, have a look at the
perl regular expression manpage ("<a href="http://perldoc.perl.org/perlre.html">perldoc
perlre</a>"). If you are interested in more detailed
information about regular expressions and their variants
(POSIX regex etc.) the following book is dedicated to this topic:</p>
<p class="indent">
<em>Mastering Regular Expressions, 2nd Edition</em><br />
Jeffrey E.F. Friedl<br />
O'Reilly &amp; Associates, Inc. 2002<br />
ISBN 0-596-00289-0<br />
</p>
<p>In mod_rewrite, the NOT character
('<code>!</code>') is also available as a possible pattern
prefix. This enables you to negate a pattern; to say, for instance:
``<em>if the current URL does <strong>NOT</strong> match this
pattern</em>''. This can be used for exceptional cases, where
it is easier to match the negative pattern, or as a last
default rule.</p>
<div class="note"><h3>Note</h3>
When using the NOT character to negate a pattern, you cannot include
grouped wildcard parts in that pattern. This is because, when the
pattern does NOT match (ie, the negation matches), there are no
contents for the groups. Thus, if negated patterns are used, you
cannot use <code>$N</code> in the substitution string!
</div>
<p>The <a id="rhs" name="rhs"><em>Substitution</em></a> of a
rewrite rule is the string that replaces the original URL-path that
was matched by <em>Pattern</em>. The <em>Substitution</em> may
be a:</p>
<dl>
<dt>file-system path</dt>
<dd>Designates the location on the file-system of the resource
to be delivered to the client.</dd>
<dt>URL-path</dt>
<dd>A <code class="directive"><a href="/mod/core.html#documentroot">DocumentRoot</a></code>-relative path to the
resource to be served. Note that <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>
tries to guess whether you have specified a file-system path
or a URL-path by checking to see if the first segment of the
path exists at the root of the file-system. For example, if
you specify a <em>Substitution</em> string of
<code>/www/file.html</code>, then this will be treated as a
URL-path <em>unless</em> a directory named <code>www</code>
exists at the root or your file-system, in which case it will
be treated as a file-system path. If you wish other
URL-mapping directives (such as <code class="directive"><a href="/mod/mod_alias.html#alias">Alias</a></code>) to be applied to the
resulting URL-path, use the <code>[PT]</code> flag as
described below.</dd>
<dt>Absolute URL</dt>
<dd>If an absolute URL is specified,
<code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> checks to see whether the
hostname matches the current host. If it does, the scheme and
hostname are stripped out and the resulting path is treated as
a URL-path. Otherwise, an external redirect is performed for
the given URL. To force an external redirect back to the
current host, see the <code>[R]</code> flag below.</dd>
<dt><code>-</code> (dash)</dt>
<dd>A dash indicates that no substitution should be performed
(the existing path is passed through untouched). This is used
when a flag (see below) needs to be applied without changing
the path.</dd>
</dl>
<p>In addition to plain text, the <em>Substition</em> string can include</p>
<ol>
<li>back-references (<code>$N</code>) to the RewriteRule
pattern</li>
<li>back-references (<code>%N</code>) to the last matched
RewriteCond pattern</li>
<li>server-variables as in rule condition test-strings
(<code>%{VARNAME}</code>)</li>
<li><a href="#mapfunc">mapping-function</a> calls
(<code>${mapname:key|default}</code>)</li>
</ol>
<p>Back-references are identifiers of the form
<code>$</code><strong>N</strong>
(<strong>N</strong>=0..9), which will be replaced
by the contents of the <strong>N</strong>th group of the
matched <em>Pattern</em>. The server-variables are the same
as for the <em>TestString</em> of a <code>RewriteCond</code>
directive. The mapping-functions come from the
<code>RewriteMap</code> directive and are explained there.
These three types of variables are expanded in the order above.</p>
<p>As already mentioned, all rewrite rules are
applied to the <em>Substitution</em> (in the order in which
they are defined
in the config file). The URL is <strong>completely
replaced</strong> by the <em>Substitution</em> and the
rewriting process continues until all rules have been applied,
or it is explicitly terminated by a
<code><strong>L</strong></code> flag.</p>
<div class="note"><h3>Modifying the Query String</h3>
<p>By default, the query string is passed through unchanged. You
can, however, create URLs in the substitution string containing
a query string part. Simply use a question mark inside the
substitution string to indicate that the following text should
be re-injected into the query string. When you want to erase an
existing query string, end the substitution string with just a
question mark. To combine new and old query strings, use the
<code>[QSA]</code> flag.</p>
</div>
<p>Additionally you can set special <a name="rewriteflags" id="rewriteflags">actions</a> to be performed by
appending <strong><code>[</code><em>flags</em><code>]</code></strong>
as the third argument to the <code>RewriteRule</code>
directive. <em>Flags</em> is a comma-separated list, surround by square
brackets, of any of the following flags: </p>
<dl>
<dt>'<code>B</code>' (escape backreferences)</dt>
<dd><p>Apache has to unescape URLs before mapping them,
so backreferences will be unescaped at the time they are applied.
Using the B flag, non-alphanumeric characters in backreferences
will be escaped. For example, consider the rule:</p>
<pre><code> RewriteRule ^(.*)$ index.php?show=$1 </code></pre>
<p>This will map <code>/C++</code> to <code>index.php?show=/C++</code>.
But it will also map <code>/C%2b%2b</code> to
<code>index.php?show=/C++</code>, because the <code>%2b</code>
has been unescaped. With the B flag, it will instead map to
<code>index.php?show=/C%2b%2b</code>.</p>
<p>This escaping is particularly necessary in a proxy situation,
when the backend may break if presented with an unescaped URL.</p>
</dd>
<dt>'<code>chain|C</code>'
(chained with next rule)</dt><dd>
This flag chains the current rule with the next rule
(which itself can be chained with the following rule,
and so on). This has the following effect: if a rule
matches, then processing continues as usual -
the flag has no effect. If the rule does
<strong>not</strong> match, then all following chained
rules are skipped. For instance, it can be used to remove the
``<code>.www</code>'' part, inside a per-directory rule set,
when you let an external redirect happen (where the
``<code>.www</code>'' part should not occur!).</dd>
<dt>'<code>cookie|CO=</code><em>NAME</em>:<em>VAL</em>:<em>domain</em>[:<em>lifetime</em>[:<em>path</em>]]'
(set cookie)</dt><dd>
This sets a cookie in the client's browser. The cookie's name
is specified by <em>NAME</em> and the value is
<em>VAL</em>. The <em>domain</em> field is the domain of the
cookie, such as '.apache.org', the optional <em>lifetime</em>
is the lifetime of the cookie in minutes, and the optional
<em>path</em> is the path of the cookie</dd>
<dt>
'<code>env|E=</code><em>VAR</em>:<em>VAL</em>'
(set environment variable)</dt><dd>
This forces an environment variable named <em>VAR</em> to
be set to the value <em>VAL</em>, where <em>VAL</em> can
contain regexp backreferences (<code>$N</code> and
<code>%N</code>) which will be expanded. You can use this
flag more than once, to set more than one variable. The
variables can later be dereferenced in many situations, most commonly
from within XSSI (via <code>&lt;!--#echo
var="VAR"--&gt;</code>) or CGI (<code>$ENV{'VAR'}</code>).
You can also dereference the variable in a later RewriteCond pattern, using
<code>%{ENV:VAR}</code>. Use this to strip
information from URLs, while maintaining a record of that information.</dd>
<dt>'<code>forbidden|F</code>' (force URL
to be forbidden)</dt><dd>
This forces the current URL to be forbidden - it immediately
sends back a HTTP response of 403 (FORBIDDEN).
Use this flag in conjunction with
appropriate RewriteConds to conditionally block some
URLs.</dd>
<dt>'<code>gone|G</code>' (force URL to be
gone)</dt><dd>
This forces the current URL to be gone - it
immediately sends back a HTTP response of 410 (GONE). Use
this flag to mark pages which no longer exist as gone.</dd>
<dt>
'<code>handler|H</code>=<em>Content-handler</em>'
(force Content handler)</dt><dd>
Force the Content-handler of the target file to be
<em>Content-handler</em>. For instance, this can be used to
simulate the <code class="module"><a href="/mod/mod_alias.html">mod_alias</a></code> directive
<code class="directive"><a href="/mod/mod_alias.html#scriptalias">ScriptAlias</a></code>,
which internally forces all files
inside the mapped directory to have a handler of
``<code>cgi-script</code>''.</dd>
<dt>'<code>last|L</code>'
(last rule)</dt><dd> Stop the rewriting process
here and don't apply any more rewrite rules. This corresponds
to the Perl <code>last</code> command or the
<code>break</code> command in C. Use this flag to prevent the
currently rewritten URL from being rewritten further by
following rules. Remember, however, that if the
<code class="directive">RewriteRule</code> generates an internal
redirect (which frequently occurs when rewriting in a
per-directory context), this will reinject the request and
will cause processing to be repeated starting from the first
<code class="directive">RewriteRule</code>.</dd>
<dt>'<code>next|N</code>'
(next round)</dt><dd>
Re-run the rewriting process (starting again with the
first rewriting rule). This time, the URL to match is no longer
the original URL, but rather the URL returned by the last rewriting rule.
This corresponds to the Perl <code>next</code> command or
the <code>continue</code> command in C. Use
this flag to restart the rewriting process -
to immediately go to the top of the loop.
<strong>Be careful not to create an infinite
loop!</strong></dd>
<dt>'<code>nocase|NC</code>'
(no case)</dt><dd>
This makes the <em>Pattern</em> case-insensitive,
ignoring difference between 'A-Z' and
'a-z' when <em>Pattern</em> is matched against the current
URL.</dd>
<dt>
'<code>noescape|NE</code>'
(no URI escaping of
output)</dt><dd>
This flag prevents mod_rewrite from applying the usual URI
escaping rules to the result of a rewrite. Ordinarily,
special characters (such as '%', '$', ';', and so on)
will be escaped into their hexcode equivalents ('%25',
'%24', and '%3B', respectively); this flag prevents this
from happening. This allows percent symbols to appear in
the output, as in
<div class="example"><p><code>
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
</code></p></div>
which would turn '<code>/foo/zed</code>' into a safe
request for '<code>/bar?arg=P1=zed</code>'.
</dd>
<dt>
'<code>nosubreq|NS</code>'
(not for internal
sub-requests)</dt><dd>
<p>This flag forces the rewriting engine to skip a
rewriting rule if the current request is an internal
sub-request. For instance, sub-requests occur internally
in Apache when <code class="module"><a href="/mod/mod_include.html">mod_include</a></code> tries to find out
information about possible directory default files
(<code>index.xxx</code> files). On sub-requests it is not
always useful, and can even cause errors, if
the complete set of rules are applied. Use this flag to
exclude some rules.</p>
<p>To decide whether or not to use this rule: if you
prefix URLs with CGI-scripts, to force them to be
processed by the CGI-script, it's likely that you
will run into problems (or significant overhead) on
sub-requests. In these cases, use this flag.</p>
</dd>
<dt>
'<code>proxy|P</code>' (force
proxy)</dt><dd>
This flag forces the substitution part to be internally
sent as a proxy request and immediately (rewrite
processing stops here) put through the <a href="mod_proxy.html">proxy module</a>. You must make
sure that the substitution string is a valid URI
(typically starting with
<code>http://</code><em>hostname</em>) which can be
handled by the Apache proxy module. If not, you will get an
error from the proxy module. Use this flag to achieve a
more powerful implementation of the <a href="mod_proxy.html#proxypass">ProxyPass</a> directive,
to map remote content into the namespace of the local
server.
<p>Note: <code class="module"><a href="/mod/mod_proxy.html">mod_proxy</a></code> must be enabled in order
to use this flag.</p>
</dd>
<dt>
'<code>passthrough|PT</code>'
(pass through to next
handler)</dt><dd>
This flag forces the rewrite engine to set the
<code>uri</code> field of the internal
<code>request_rec</code> structure to the value of the
<code>filename</code> field. This flag is just a hack to
enable post-processing of the output of
<code>RewriteRule</code> directives, using
<code>Alias</code>, <code>ScriptAlias</code>,
<code>Redirect</code>, and other directives from
various URI-to-filename translators. For example, to rewrite
<code>/abc</code> to <code>/def</code> using
<code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>, and then
<code>/def</code> to <code>/ghi</code> using
<code class="module"><a href="/mod/mod_alias.html">mod_alias</a></code>:
<div class="example"><p><code>
RewriteRule ^/abc(.*) /def$1 [PT]<br />
Alias /def /ghi
</code></p></div>
If you omit the <code>PT</code> flag,
<code>mod_rewrite</code> will rewrite
<code>uri=/abc/...</code> to
<code>filename=/def/...</code> as a full API-compliant
URI-to-filename translator should do. Then
<code>mod_alias</code> will try to do a
URI-to-filename transition, which will fail.
<p>Note: <strong>You must use this flag if you want to
mix directives from different modules which allow
URL-to-filename translators</strong>. The typical example
is the use of <code class="module"><a href="/mod/mod_alias.html">mod_alias</a></code> and
<code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>.</p>
<p>The <code>PT</code> flag implies the <code>L</code> flag:
rewriting will be stopped in order to pass the request to
the next phase of processing.</p>
</dd>
<dt>'<code>qsappend|QSA</code>'
(query string
append)</dt><dd>
This flag forces the rewrite engine to append a query
string part of the substitution string to the existing string,
instead of replacing it. Use this when you want to add more
data to the query string via a rewrite rule.</dd>
<dt>'<code>redirect|R</code>
[=<em>code</em>]' (force <a id="redirect" name="redirect">redirect</a>)</dt><dd>
<p>Prefix <em>Substitution</em> with
<code>http://thishost[:thisport]/</code> (which makes the
new URL a URI) to force a external redirection. If no
<em>code</em> is given, a HTTP response of 302 (MOVED
TEMPORARILY) will be returned. If you want to use other
response codes, simply specify the appropriate number or use
one of the following symbolic names: <code>temp</code>
(default), <code>permanent</code>,
<code>seeother</code>. Use this for rules to canonicalize
the URL and return it to the client - to translate
``<code>/~</code>'' into ``<code>/u/</code>'', or to always
append a slash to <code>/u/</code><em>user</em>, etc.<br />
<strong>Note:</strong> When you use this flag, make sure
that the substitution field is a valid URL! Otherwise, you
will be redirecting to an invalid location. Remember that
this flag on its own will only prepend
<code>http://thishost[:thisport]/</code> to the URL, and
rewriting will continue. Usually, you will want to stop
rewriting at this point, and redirect immediately. To stop
rewriting, you should add the 'L' flag.</p>
<p>While this is typically used for redirects, any valid status
code can be given here. If the status code is outside the redirect
range (300-399), then the <em>Substitution</em> string is dropped
and rewriting is stopped as if the <code>L</code> flag was
used.</p>
</dd>
<dt>'<code>skip|S</code>=<em>num</em>'
(skip next rule(s))</dt><dd>
This flag forces the rewriting engine to skip the next
<em>num</em> rules in sequence, if the current rule
matches. Use this to make pseudo if-then-else constructs:
The last rule of the then-clause becomes
<code>skip=N</code>, where N is the number of rules in the
else-clause. (This is <strong>not</strong> the same as the
'chain|C' flag!)</dd>
<dt>
'<code>type|T</code>=<em>MIME-type</em>'
(force MIME type)</dt><dd>
Force the <a class="glossarylink" href="/glossary.html#mime-type" title="see glossary">MIME-type</a> of the target file to be
<em>MIME-type</em>. This can be used to
set up the content-type based on some conditions.
For example, the following snippet allows <code>.php</code> files to
be <em>displayed</em> by <code>mod_php</code> if they are called with
the <code>.phps</code> extension:
<div class="example"><p><code>
RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
</code></p></div>
</dd>
</dl>
<div class="note"><h3>Home directory expansion</h3>
<p> When the substitution string begins with a string
resembling "/~user" (via explicit text or backreferences), mod_rewrite performs
home directory expansion independent of the presence or configuration
of <code class="module"><a href="/mod/mod_userdir.html">mod_userdir</a></code>.</p>
<p> This expansion does not occur when the <em>PT</em>
flag is used on the <code class="directive"><a href="#rewriterule">RewriteRule</a></code>
directive.</p>
</div>
<div class="note"><h3>Per-directory Rewrites</h3>
<p>The rewrite engine may be used in <a href="/howto/htaccess.html">.htaccess</a> files. To enable the
rewrite engine for these files you need to set
"<code>RewriteEngine On</code>" <strong>and</strong>
"<code>Options FollowSymLinks</code>" must be enabled. If your
administrator has disabled override of <code>FollowSymLinks</code> for
a user's directory, then you cannot use the rewrite engine. This
restriction is required for security reasons.</p>
<p>When using the rewrite engine in <code>.htaccess</code> files the
per-directory prefix (which always is the same for a specific
directory) is automatically <em>removed</em> for the pattern matching
and automatically <em>added</em> after the substitution has been
done. This feature is essential for many sorts of rewriting; without
this, you would always have to match the parent directory, which is
not always possible. There is one exception: If a substitution string
starts with <code>http://</code>, then the directory prefix will
<strong>not</strong> be added, and an external redirect (or proxy
throughput, if using flag <strong>P</strong>) is forced. See the
<code class="directive"><a href="#rewritebase">RewriteBase</a></code> directive for
more information.</p>
<p>The rewrite engine may also be used in <code class="directive"><a href="/mod/core.html#directory">&lt;Directory&gt;</a></code> sections with the same
prefix-matching rules as would be applied to <code>.htaccess</code>
files. It is usually simpler, however, to avoid the prefix substitution
complication by putting the rewrite rules in the main server or
virtual host context, rather than in a <code class="directive"><a href="/mod/core.html#directory">&lt;Directory&gt;</a></code> section.</p>
<p>Although rewrite rules are syntactically permitted in <code class="directive"><a href="/mod/core.html#location">&lt;Location&gt;</a></code> sections, this
should never be necessary and is unsupported.</p>
</div>
<p>Here are all possible substitution combinations and their
meanings:</p>
<p><strong>Inside per-server configuration
(<code>httpd.conf</code>)<br />
for request ``<code>GET
/somepath/pathinfo</code>'':</strong><br />
</p>
<div class="note"><pre>
<strong>Given Rule</strong> <strong>Resulting Substitution</strong>
---------------------------------------------- ----------------------------------
^/somepath(.*) otherpath$1 invalid, not supported
^/somepath(.*) otherpath$1 [R] invalid, not supported
^/somepath(.*) otherpath$1 [P] invalid, not supported
---------------------------------------------- ----------------------------------
^/somepath(.*) /otherpath$1 /otherpath/pathinfo
^/somepath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
via external redirection
^/somepath(.*) /otherpath$1 [P] doesn't make sense, not supported
---------------------------------------------- ----------------------------------
^/somepath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo
via external redirection
^/somepath(.*) http://thishost/otherpath$1 [P] doesn't make sense, not supported
---------------------------------------------- ----------------------------------
^/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo
via external redirection
^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
via external redirection
(the [R] flag is redundant)
^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
via internal proxy
</pre></div>
<p><strong>Inside per-directory configuration for
<code>/somepath</code><br />
(<code>/physical/path/to/somepath/.htacccess</code>, with
<code>RewriteBase /somepath</code>)<br />
for request ``<code>GET
/somepath/localpath/pathinfo</code>'':</strong><br />
</p>
<div class="note"><pre>
<strong>Given Rule</strong> <strong>Resulting Substitution</strong>
---------------------------------------------- ----------------------------------
^localpath(.*) otherpath$1 /somepath/otherpath/pathinfo
^localpath(.*) otherpath$1 [R] http://thishost/somepath/otherpath/pathinfo
via external redirection
^localpath(.*) otherpath$1 [P] doesn't make sense, not supported
---------------------------------------------- ----------------------------------
^localpath(.*) /otherpath$1 /otherpath/pathinfo
^localpath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
via external redirection
^localpath(.*) /otherpath$1 [P] doesn't make sense, not supported
---------------------------------------------- ----------------------------------
^localpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^localpath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo
via external redirection
^localpath(.*) http://thishost/otherpath$1 [P] doesn't make sense, not supported
---------------------------------------------- ----------------------------------
^localpath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo
via external redirection
^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
via external redirection
(the [R] flag is redundant)
^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
via internal proxy
</pre></div>
</div>
</div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="/en/mod/mod_rewrite.html" title="English">&nbsp;en&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2007 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<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>
</body></html>