mod_rewrite.xml revision a4d04b8c74044c58bd4182028a1408d936c95951
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<?xml version="1.0"?>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<!DOCTYPE modulesynopsis SYSTEM "/style/modulesynopsis.dtd">
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<?xml-stylesheet type="text/xsl" href="/style/manual.en.xsl"?>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<!-- $LastChangedRevision$ -->
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<!--
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Licensed to the Apache Software Foundation (ASF) under one or more
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor contributor license agreements. See the NOTICE file distributed with
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor this work for additional information regarding copyright ownership.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor The ASF licenses this file to You under the Apache License, Version 2.0
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (the "License"); you may not use this file except in compliance with
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the License. You may obtain a copy of the License at
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor http://www.apache.org/licenses/LICENSE-2.0
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Unless required by applicable law or agreed to in writing, software
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor distributed under the License is distributed on an "AS IS" BASIS,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor See the License for the specific language governing permissions and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor limitations under the License.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor-->
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<modulesynopsis metafile="mod_rewrite.xml.meta">
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>mod_rewrite</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Provides a rule-based rewriting engine to rewrite requested
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorURLs on the fly</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<status>Extension</status>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<sourcefile>mod_rewrite.c</sourcefile>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<identifier>rewrite_module</identifier>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<compatibility>Available in Apache 1.3 and later</compatibility>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<summary>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This module uses a rule-based rewriting engine (based on a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor regular-expression parser) to rewrite requested URLs on the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor fly. It supports an unlimited number of rules and an
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor unlimited number of attached rule conditions for each rule, to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor provide a really flexible and powerful URL manipulation
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor mechanism. The URL manipulations can depend on various tests,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor of server variables, environment variables, HTTP
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor headers, or time stamps. Even external database lookups in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor various formats can be used to achieve highly granular URL
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor matching.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This module operates on the full URLs (including the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path-info part) both in per-server context
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<code>httpd.conf</code>) and per-directory context
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<code>.htaccess</code>) and can generate query-string
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor parts on result. The rewritten result can lead to internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sub-processing, external request redirection or even to an
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor internal proxy throughput.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Further details, discussion, and examples, are provided in the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <a href="/rewrite/">detailed mod_rewrite documentation</a>.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</summary>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<seealso><a href="#rewriteflags">Rewrite Flags</a></seealso>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<section id="quoting"><title>Quoting Special Characters</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>As of Apache 1.3.20, special characters in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>TestString</em> and <em>Substitution</em> strings can be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor escaped (that is, treated as normal characters without their
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor usual special meaning) by prefixing them with a slash ('\')
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor character. In other words, you can include an actual
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor dollar-sign character in a <em>Substitution</em> string by
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor using '<code>\$</code>'; this keeps mod_rewrite from trying
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to treat it as a backreference.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</section>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<section id="EnvVar"><title>Environment Variables</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This module keeps track of two additional (non-standard)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor CGI/SSI environment variables named <code>SCRIPT_URL</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor and <code>SCRIPT_URI</code>. These contain the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>logical</em> Web-view to the current resource, while the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor standard CGI/SSI variables <code>SCRIPT_NAME</code> and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>SCRIPT_FILENAME</code> contain the <em>physical</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor System-view. </p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Notice: These variables hold the URI/URL <em>as they were
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor initially requested</em>, that is, <em>before</em> any
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting. This is important to note because the rewriting process is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor primarily used to rewrite logical URLs to physical
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor pathnames.<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor These variables are set in per-server context, which means
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor that they are available in per-directory context only, if
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive>RewriteEngine</directive> is set to <code>on</code> in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor per-server context.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example><title>Example</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorSCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorSCRIPT_FILENAME=/u/rse/.www/index.html
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorSCRIPT_URL=/u/rse/
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorSCRIPT_URI=http://en1.engelschall.com/u/rse/
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</section>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<section id="vhosts"><title>Rewriting in Virtual Hosts</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>By default, <module>mod_rewrite</module> configuration
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor settings from the main server context are not inherited by
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor virtual hosts. To make the main server settings apply to virtual
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor hosts, you must place the following directives in each <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor module="core" type="section">VirtualHost</directive> section:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteEngine On<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteOptions Inherit
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</section>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<section id="Solutions"><title>Practical Solutions</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>For numerous examples of common, and not-so-common, uses for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor mod_rewrite, see the <a href="/rewrite/rewrite_guide.html">Rewrite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Guide</a>, and the <a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor href="/rewrite/rewrite_guide_advanced.html">Advanced Rewrite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Guide</a> documents.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</section>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteEngine</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Enables or disables runtime rewriting engine</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax>RewriteEngine on|off</syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<default>RewriteEngine off</default>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>server config</context><context>virtual host</context>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<context>directory</context><context>.htaccess</context></contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<override>FileInfo</override>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteEngine</directive> directive enables or
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor disables the runtime rewriting engine. If it is set to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>off</code> this module does no runtime processing at
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor all. It does not even update the <code>SCRIPT_URx</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor environment variables.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Use this directive to disable the module instead of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor commenting out all the <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor module="mod_rewrite">RewriteRule</directive> directives!</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Note that rewrite configurations are not
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor inherited by virtual hosts. This means that you need to have a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>RewriteEngine on</code> directive for each virtual host
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor in which you wish to use rewrite rules.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><directive>RewriteMap</directive> directives of the type <code>prg</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor are not started during server initialization if they're defined in a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor context that does not have <directive>RewriteEngine</directive> set to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>on</code></p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteOptions</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Sets some special options for the rewrite engine</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax>RewriteOptions <var>Options</var></syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>server config</context><context>virtual host</context>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<context>directory</context><context>.htaccess</context></contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<override>FileInfo</override>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<compatibility><code>MaxRedirects</code> is no longer available in version 2.1 and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorlater</compatibility>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteOptions</directive> directive sets some
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor special options for the current per-server or per-directory
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor configuration. The <em>Option</em> string can currently
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor only be one of the following:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dl>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt><code>inherit</code></dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>This forces the current configuration to inherit the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor configuration of the parent. In per-virtual-server context,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor this means that the maps, conditions and rules of the main
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor server are inherited. In per-directory context this means
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor that conditions and rules of the parent directory's
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>.htaccess</code> configuration or
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive type="section" module="core">Directory</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sections are inherited. The inherited rules are virtually copied
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to the section where this directive is being used. If used in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor combination with local rules, the inherited rules are copied behind
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the local rules. The position of this directive - below or above
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor of local rules - has no influence on this behavior. If local
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rules forced the rewriting to stop, the inherited rules won't
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor be processed.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dl>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteLog</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Sets the name of the file used for logging rewrite engine
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorprocessing</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax>RewriteLog <em>file-path</em></syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>server config</context><context>virtual host</context>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteLog</directive> directive sets the name
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor of the file to which the server logs any rewriting actions it
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor performs. If the name does not begin with a slash
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ('<code>/</code>') then it is assumed to be relative to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>Server Root</em>. The directive should occur only once per
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor server config.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note> To disable the logging of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting actions it is not recommended to set
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>Filename</em> to <code>/dev/null</code>, because
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor although the rewriting engine does not then output to a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor logfile it still creates the logfile output internally.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>This will slow down the server with no advantage
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to the administrator!</strong> To disable logging either
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor remove or comment out the <directive>RewriteLog</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor directive or use <code>RewriteLogLevel 0</code>!
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note type="securitywarning"><title>Security</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorSee the <a href="/misc/security_tips.html">Apache Security Tips</a>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzordocument for details on how your security could be compromised if the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzordirectory where logfiles are stored is writable by anyone other than
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorthe user that starts the server.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example><title>Example</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteLog "/usr/local/var/apache/logs/rewrite.log"
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteLogLevel</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Sets the verbosity of the log file used by the rewrite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorengine</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax>RewriteLogLevel <em>Level</em></syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<default>RewriteLogLevel 0</default>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>server config</context><context>virtual host</context>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteLogLevel</directive> directive sets the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor verbosity level of the rewriting logfile. The default level 0
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor means no logging, while 9 or more means that practically all
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor actions are logged.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>To disable the logging of rewriting actions simply set
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>Level</em> to 0. This disables all rewrite action
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor logs.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note> Using a high value for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>Level</em> will slow down your Apache server
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor dramatically! Use the rewriting logfile at a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>Level</em> greater than 2 only for debugging!
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example><title>Example</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteLogLevel 3
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteLock</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Sets the name of the lock file used for <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzormodule="mod_rewrite">RewriteMap</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorsynchronization</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax>RewriteLock <em>file-path</em></syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>server config</context></contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This directive sets the filename for a synchronization
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor lockfile which mod_rewrite needs to communicate with <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor module="mod_rewrite">RewriteMap</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>programs</em>. Set this lockfile to a local path (not on a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor NFS-mounted device) when you want to use a rewriting
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor map-program. It is not required for other types of rewriting
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor maps.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteMap</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Defines a mapping function for key-lookup</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax>RewriteMap <em>MapName</em> <em>MapType</em>:<em>MapSource</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>server config</context><context>virtual host</context>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<compatibility>The choice of different dbm types is available in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorApache 2.0.41 and later</compatibility>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteMap</directive> directive defines a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>Rewriting Map</em> which can be used inside rule
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor substitution strings by the mapping-functions to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor insert/substitute fields through a key lookup. The source of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor this lookup can be of various types.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <a id="mapfunc" name="mapfunc"><em>MapName</em></a> is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the name of the map and will be used to specify a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor mapping-function for the substitution strings of a rewriting
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rule via one of the following constructs:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p class="indent">
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong><code>${</code> <em>MapName</em> <code>:</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>LookupKey</em> <code>}</code><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>${</code> <em>MapName</em> <code>:</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>LookupKey</em> <code>|</code> <em>DefaultValue</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>}</code></strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>When such a construct occurs, the map <em>MapName</em> is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor consulted and the key <em>LookupKey</em> is looked-up. If the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor key is found, the map-function construct is substituted by
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>SubstValue</em>. If the key is not found then it is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor substituted by <em>DefaultValue</em> or by the empty string
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor if no <em>DefaultValue</em> was specified.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>For example, you might define a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive>RewriteMap</directive> as:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteMap examplemap txt:/path/to/file/map.txt
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>You would then be able to use this map in a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive>RewriteRule</directive> as follows:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteRule ^/ex/(.*) ${examplemap:$1}
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The following combinations for <em>MapType</em> and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>MapSource</em> can be used:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>Standard Plain Text</strong><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor MapType: <code>txt</code>, MapSource: Unix filesystem
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path to valid regular file
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This is the standard rewriting map feature where the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>MapSource</em> is a plain ASCII file containing
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor either blank lines, comment lines (starting with a '#'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor character) or pairs like the following - one per
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor line.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p class="indent">
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong><em>MatchingKey</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>SubstValue</em></strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example><title>Example</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor##
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor## map.txt -- rewriting map
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor##
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRalf.S.Engelschall rse # Bastard Operator From Hell
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorMr.Joe.Average joe # Mr. Average
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteMap real-to-user txt:/path/to/file/map.txt
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>Randomized Plain Text</strong><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor MapType: <code>rnd</code>, MapSource: Unix filesystem
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path to valid regular file
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This is identical to the Standard Plain Text variant
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor above but with a special post-processing feature: After
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor looking up a value it is parsed according to contained
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>|</code>'' characters which have the meaning of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``or''. In other words they indicate a set of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor alternatives from which the actual returned value is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor chosen randomly. For example, you might use the following map
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor file and directives to provide a random load balancing between
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor several back-end server, via a reverse-proxy. Images are sent
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to one of the servers in the 'static' pool, while everything
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor else is sent to one of the 'dynamic' pool.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Example:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example><title>Rewrite map file</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor##
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor## map.txt -- rewriting map
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor##
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorstatic www1|www2|www3|www4
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzordynamic www5|www6
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example><title>Configuration directives</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteMap servers rnd:/path/to/file/map.txt<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor[NC,P,L]<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteRule ^/(.*) http://${servers:dynamic}/$1 [P,L]
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>Hash File</strong><br /> MapType:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>dbm[=<em>type</em>]</code>, MapSource: Unix filesystem
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path to valid regular file
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Here the source is a binary format DBM file containing
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the same contents as a <em>Plain Text</em> format file, but
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor in a special representation which is optimized for really
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor fast lookups. The <em>type</em> can be sdbm, gdbm, ndbm, or
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor db depending on <a href="/install.html#dbm">compile-time
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor settings</a>. If the <em>type</em> is omitted, the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor compile-time default will be chosen.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>To create a dbm file from a source text file, use the <a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor href="/programs/httxt2dbm.html">httxt2dbm</a> utility.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor$ httxt2dbm -i mapfile.txt -o mapfile.map
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>Internal Function</strong><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor MapType: <code>int</code>, MapSource: Internal Apache
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor function
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Here, the source is an internal Apache function.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Currently you cannot create your own, but the following
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor functions already exist:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li><strong>toupper</strong>:<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Converts the key to all upper case.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li><strong>tolower</strong>:<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Converts the key to all lower case.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li><strong>escape</strong>:<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Translates special characters in the key to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor hex-encodings.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li><strong>unescape</strong>:<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Translates hex-encodings in the key back to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor special characters.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>External Rewriting Program</strong><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor MapType: <code>prg</code>, MapSource: Unix filesystem
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path to valid regular file
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Here the source is a program, not a map file. To
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor create it you can use a language of your choice, but
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the result has to be an executable program (either
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor object-code or a script with the magic cookie trick
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>#!/path/to/interpreter</code>' as the first
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor line).</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This program is started once, when the Apache server
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is started, and then communicates with the rewriting engine
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via its <code>stdin</code> and <code>stdout</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor file-handles. For each map-function lookup it will
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor receive the key to lookup as a newline-terminated string
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor on <code>stdin</code>. It then has to give back the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor looked-up value as a newline-terminated string on
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>stdout</code> or the four-character string
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>NULL</code>'' if it fails (<em>i.e.</em>, there
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is no corresponding value for the given key).</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>External rewriting programs are not started if they're defined in a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor context that does not have <directive>RewriteEngine</directive> set to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>on</code></p>.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>A trivial program which will implement a 1:1 map (<em>i.e.</em>,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor key == value) could be:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor#!/usr/bin/perl
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor$| = 1;
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorwhile (&lt;STDIN&gt;) {
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor # ...put here any transformations or lookups...
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor print $_;
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor}
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>But be very careful:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ol>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>``<em>Keep it simple, stupid</em>'' (KISS).
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor If this program hangs, it will cause Apache to hang
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor when trying to use the relevant rewrite rule.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>A common mistake is to use buffered I/O on
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>stdout</code>. Avoid this, as it will cause a deadloop!
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>$|=1</code>'' is used above, to prevent this.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>The <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor module="mod_rewrite">RewriteLock</directive> directive can
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor be used to define a lockfile which mod_rewrite can use to synchronize
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor communication with the mapping program. By default no such
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor synchronization takes place.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ol>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><strong>SQL Query</strong><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor MapType: <code>dbd</code> or <code>fastdbd</code>,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor MapSource: An SQL SELECT statement that takes a single
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor argument and returns a single value.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This uses <module>mod_dbd</module> to implement a rewritemap
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor by lookup in an SQL database. There are two forms:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>fastdbd</code> caches database lookups internally,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>dbd</code> doesn't. So <code>dbd</code> incurs a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor performance penalty but responds immediately if the database
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor contents are updated, while <code>fastdbd</code> is more
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor efficient but won't re-read database contents until server
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor restart.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>If a query returns more than one row, a random row from
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the result set is used.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<title>Example</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteMap myquery "fastdbd:SELECT destination FROM rewrite WHERE source = %s"
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteMap</directive> directive can occur more than
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor once. For each mapping-function use one
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive>RewriteMap</directive> directive to declare its rewriting
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor mapfile. While you cannot <strong>declare</strong> a map in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor per-directory context it is of course possible to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>use</strong> this map in per-directory context. </p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><title>Note</title> For plain text and DBM format files the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorlooked-up keys are cached in-core until the <code>mtime</code> of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzormapfile changes or the server does a restart. This way you can have
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzormap-functions in rules which are used for <strong>every</strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorrequest. This is no problem, because the external lookup only happens
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzoronce!
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteBase</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Sets the base URL for per-directory rewrites</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax>RewriteBase <em>URL-path</em></syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<default>See usage for information.</default>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>directory</context><context>.htaccess</context>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<override>FileInfo</override>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteBase</directive> directive explicitly
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sets the base URL for per-directory rewrites. As you will see
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor below, <directive module="mod_rewrite">RewriteRule</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor can be used in per-directory config files
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<code>.htaccess</code>). In such a case, it will act locally,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor stripping the local directory prefix before processing, and applying
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewrite rules only to the remainder. When processing is complete, the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor prefix is automatically added back to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path. The default setting is; <directive>RewriteBase</directive> <em>physical-directory-path</em></p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>When a substitution occurs for a new URL, this module has
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to re-inject the URL into the server processing. To be able
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to do this it needs to know what the corresponding URL-prefix
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor or URL-base is. By default this prefix is the corresponding
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor filepath itself. <strong>However, for most websites, URLs are NOT
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor directly related to physical filename paths, so this
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor assumption will often be wrong!</strong> Therefore, you can
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor use the <code>RewriteBase</code> directive to specify the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor correct URL-prefix.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note> If your webserver's URLs are <strong>not</strong> directly
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorrelated to physical file paths, you will need to use
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directive>RewriteBase</directive> in every <code>.htaccess</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorfile where you want to use <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzormodule="mod_rewrite">RewriteRule</directive> directives.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p> For example, assume the following per-directory config file:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor#
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor# /abc/def/.htaccess -- per-dir config file for directory /abc/def
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor# Remember: /abc/def is the physical path of /xyz, <em>i.e.</em>, the server
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor# has a 'Alias /xyz /abc/def' directive <em>e.g.</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor#
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteEngine On
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor# let the server know that we were reached via /xyz and not
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor# via the physical path prefix /abc/def
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteBase /xyz
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor# now the rewriting rules
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteRule ^oldstuff\.html$ newstuff.html
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>In the above example, a request to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>/xyz/oldstuff.html</code> gets correctly rewritten to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the physical file <code>/abc/def/newstuff.html</code>.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><title>For Apache Hackers</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<p>The following list gives detailed information about
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the internal processing steps:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRequest:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /xyz/oldstuff.html
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorInternal Processing:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /xyz/oldstuff.html -&gt; /abc/def/oldstuff.html (per-server Alias)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /abc/def/oldstuff.html -&gt; /abc/def/newstuff.html (per-dir RewriteRule)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /abc/def/newstuff.html -&gt; /xyz/newstuff.html (per-dir RewriteBase)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /xyz/newstuff.html -&gt; /abc/def/newstuff.html (per-server Alias)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorResult:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /abc/def/newstuff.html
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This seems very complicated, but is in fact
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor correct Apache internal processing. Because the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor per-directory rewriting comes late in the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor process, the rewritten request
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor has to be re-injected into the Apache kernel, as if it
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor were a new request. (See <a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor href="/rewrite/rewrite_tech.html">mod_rewrite technical
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor details</a>.)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This is not the serious overhead it may seem to be -
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor this re-injection is completely internal to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Apache server (and the same procedure is used by
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor many other operations within Apache).</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteCond</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Defines a condition under which rewriting will take place
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax> RewriteCond
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>TestString</em> <em>CondPattern</em></syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>server config</context><context>virtual host</context>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<context>directory</context><context>.htaccess</context></contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<override>FileInfo</override>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteCond</directive> directive defines a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rule condition. One or more <directive>RewriteCond</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor can precede a <directive module="mod_rewrite">RewriteRule</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor directive. The following rule is then only used if both
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the current state of the URI matches its pattern, <strong
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor >and</strong> if these conditions are met.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><em>TestString</em> is a string which can contain the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor following expanded constructs in addition to plain text:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>RewriteRule backreferences</strong>: These are
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor backreferences of the form <strong><code>$N</code></strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (0 &lt;= N &lt;= 9), which provide access to the grouped
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor parts (in parentheses) of the pattern, from the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>RewriteRule</code> which is subject to the current
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor set of <code>RewriteCond</code> conditions.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>RewriteCond backreferences</strong>: These are
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor backreferences of the form <strong><code>%N</code></strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (1 &lt;= N &lt;= 9), which provide access to the grouped
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor parts (again, in parentheses) of the pattern, from the last matched
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>RewriteCond</code> in the current set
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor of conditions.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>RewriteMap expansions</strong>: These are
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor expansions of the form <strong><code
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor >${mapname:key|default}</code></strong>.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor See <a href="#mapfunc">the documentation for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteMap</a> for more details.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>Server-Variables</strong>: These are variables of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the form
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong><code>%{</code> <em>NAME_OF_VARIABLE</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>}</code></strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor where <em>NAME_OF_VARIABLE</em> can be a string taken
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor from the following list:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <table>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <columnspec><column width=".3"/><column width=".3"/>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <column width=".3"/></columnspec>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <tr>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <th>HTTP headers:</th> <th>connection &amp; request:</th> <th></th>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </tr>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <tr>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor HTTP_USER_AGENT<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor HTTP_REFERER<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor HTTP_COOKIE<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor HTTP_FORWARDED<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor HTTP_HOST<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor HTTP_PROXY_CONNECTION<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor HTTP_ACCEPT<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REMOTE_ADDR<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REMOTE_HOST<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REMOTE_PORT<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REMOTE_USER<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REMOTE_IDENT<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REQUEST_METHOD<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor SCRIPT_FILENAME<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor PATH_INFO<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor QUERY_STRING<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor AUTH_TYPE<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <td></td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </tr>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <tr>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <th>server internals:</th> <th>date and time:</th> <th>specials:</th>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </tr>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <tr>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor DOCUMENT_ROOT<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor SERVER_ADMIN<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor SERVER_NAME<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor SERVER_ADDR<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor SERVER_PORT<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor SERVER_PROTOCOL<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor SERVER_SOFTWARE<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TIME_YEAR<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TIME_MON<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TIME_DAY<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TIME_HOUR<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TIME_MIN<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TIME_SEC<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TIME_WDAY<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TIME<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor API_VERSION<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor THE_REQUEST<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REQUEST_URI<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REQUEST_FILENAME<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor IS_SUBREQ<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor HTTPS<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </td>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </tr>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </table>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>These variables all
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor correspond to the similarly named HTTP
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor MIME-headers, C variables of the Apache server or
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>struct tm</code> fields of the Unix system.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Most are documented elsewhere in the Manual or in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the CGI specification. Those that are special to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor mod_rewrite include those below.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dl>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt><code>IS_SUBREQ</code></dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>Will contain the text "true" if the request
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor currently being processed is a sub-request,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor "false" otherwise. Sub-requests may be generated
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor by modules that need to resolve additional files
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor or URIs in order to complete their tasks.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt><code>API_VERSION</code></dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>This is the version of the Apache module API
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (the internal interface between server and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor module) in the current httpd build, as defined in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor include/ap_mmn.h. The module API version
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor corresponds to the version of Apache in use (in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the release version of Apache 1.3.14, for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor instance, it is 19990320:10), but is mainly of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor interest to module authors.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt><code>THE_REQUEST</code></dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>The full HTTP request line sent by the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor browser to the server (e.g., "<code>GET
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /index.html HTTP/1.1</code>"). This does not
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor include any additional headers sent by the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor browser.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt><code>REQUEST_URI</code></dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>The resource requested in the HTTP request
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor line. (In the example above, this would be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor "/index.html".)</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt><code>REQUEST_FILENAME</code></dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>The full local filesystem path to the file or
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor script matching the request.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt><code>HTTPS</code></dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>Will contain the text "on" if the connection is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor using SSL/TLS, or "off" otherwise. (This variable
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor can be safely used regardless of whether or not
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <module>mod_ssl</module> is loaded).</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dl>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Other things you should be aware of:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ol>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The variables SCRIPT_FILENAME and REQUEST_FILENAME
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor contain the same value - the value of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>filename</code> field of the internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>request_rec</code> structure of the Apache server.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor The first name is the commonly known CGI variable name
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor while the second is the appropriate counterpart of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REQUEST_URI (which contains the value of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>uri</code> field of <code>request_rec</code>).</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>If a substitution occurred and the rewriting continues,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the value of both variables will be updated accordingly.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>If used in per-server context (<em>i.e.</em>, before the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor request is mapped to the filesystem) SCRIPT_FILENAME and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor REQUEST_FILENAME cannot contain the full local filesystem
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path since the path is unknown at this stage of processing.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Both variables will initially contain the value of REQUEST_URI
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor in that case. In order to obtain the full local filesystem
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path of the request in per-server context, use an URL-based
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor look-ahead <code>%{LA-U:REQUEST_FILENAME}</code> to determine
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the final value of REQUEST_FILENAME.</p></li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{ENV:variable}</code>, where <em>variable</em> can be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor any environment variable, is also available.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This is looked-up via internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Apache structures and (if not found there) via
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>getenv()</code> from the Apache server process.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{SSL:variable}</code>, where <em>variable</em> is the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor name of an <a href="mod_ssl.html#envvars">SSL environment
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor variable</a>, can be used whether or not
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <module>mod_ssl</module> is loaded, but will always expand to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the empty string if it is not. Example:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>128</code>.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{HTTP:header}</code>, where <em>header</em> can be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor any HTTP MIME-header name, can always be used to obtain the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor value of a header sent in the HTTP request.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Example: <code>%{HTTP:Proxy-Connection}</code> is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the value of the HTTP header
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>Proxy-Connection:</code>''.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>If a HTTP header is used in a condition this header is added to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the Vary header of the response in case the condition evaluates to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to true for the request. It is <strong>not</strong> added if the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor condition evaluates to false for the request. Adding the HTTP header
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to the Vary header of the response is needed for proper caching.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>It has to be kept in mind that conditions follow a short circuit
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor logic in the case of the '<strong><code>ornext|OR</code></strong>' flag
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor so that certain conditions might not be evaluated at all.</p></li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{LA-U:variable}</code> can be used for look-aheads which perform
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor an internal (URL-based) sub-request to determine the final
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor value of <em>variable</em>. This can be used to access
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor variable for rewriting which is not available at the current
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor stage, but will be set in a later phase.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>For instance, to rewrite according to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>REMOTE_USER</code> variable from within the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor per-server context (<code>httpd.conf</code> file) you must
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor use <code>%{LA-U:REMOTE_USER}</code> - this
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor variable is set by the authorization phases, which come
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>after</em> the URL translation phase (during which mod_rewrite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor operates).</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>On the other hand, because mod_rewrite implements
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor its per-directory context (<code>.htaccess</code> file) via
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the Fixup phase of the API and because the authorization
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor phases come <em>before</em> this phase, you just can use
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{REMOTE_USER}</code> in that context.</p></li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{LA-F:variable}</code> can be used to perform an internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (filename-based) sub-request, to determine the final value
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor of <em>variable</em>. Most of the time, this is the same as
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor LA-U above.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ol>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><em>CondPattern</em> is the condition pattern,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor a regular expression which is applied to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor current instance of the <em>TestString</em>.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>TestString</em> is first evaluated, before being matched against
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>CondPattern</em>.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><strong>Remember:</strong> <em>CondPattern</em> is a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>perl compatible regular expression</em> with some
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor additions:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ol>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>You can prefix the pattern string with a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>!</code>' character (exclamation mark) to specify a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>non</strong>-matching pattern.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor There are some special variants of <em>CondPatterns</em>.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Instead of real regular expression strings you can also
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor use one of the following:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>&lt;CondPattern</strong>' (lexicographically
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor precedes)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Treats the <em>CondPattern</em> as a plain string and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor compares it lexicographically to <em>TestString</em>. True if
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>TestString</em> lexicographically precedes
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>CondPattern</em>.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>&gt;CondPattern</strong>' (lexicographically
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor follows)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Treats the <em>CondPattern</em> as a plain string and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor compares it lexicographically to <em>TestString</em>. True if
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>TestString</em> lexicographically follows
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>CondPattern</em>.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>=CondPattern</strong>' (lexicographically
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor equal)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Treats the <em>CondPattern</em> as a plain string and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor compares it lexicographically to <em>TestString</em>. True if
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>TestString</em> is lexicographically equal to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>CondPattern</em> (the two strings are exactly
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor equal, character for character). If <em>CondPattern</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is <code>""</code> (two quotation marks) this
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor compares <em>TestString</em> to the empty string.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>-d</strong>' (is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>d</strong>irectory)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Treats the <em>TestString</em> as a pathname and tests
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor whether or not it exists, and is a directory.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>-f</strong>' (is regular
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>f</strong>ile)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Treats the <em>TestString</em> as a pathname and tests
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor whether or not it exists, and is a regular file.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>-s</strong>' (is regular file, with
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>s</strong>ize)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Treats the <em>TestString</em> as a pathname and tests
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor whether or not it exists, and is a regular file with size greater
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor than zero.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>-l</strong>' (is symbolic
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>l</strong>ink)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Treats the <em>TestString</em> as a pathname and tests
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor whether or not it exists, and is a symbolic link.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>-x</strong>' (has e<strong>x</strong>ecutable
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor permissions)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Treats the <em>TestString</em> as a pathname and tests
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor whether or not it exists, and has executable permissions.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor These permissions are determined according to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the underlying OS.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>-F</strong>' (is existing file, via
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor subrequest)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Checks whether or not <em>TestString</em> is a valid file,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor accessible via all the server's currently-configured
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor access controls for that path. This uses an internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor subrequest to do the check, so use it with care -
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor it can impact your server's performance!</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong>-U</strong>' (is existing URL, via
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor subrequest)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Checks whether or not <em>TestString</em> is a valid URL,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor accessible via all the server's currently-configured
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor access controls for that path. This uses an internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor subrequest to do the check, so use it with care -
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor it can impact your server's performance!</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><title>Note:</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor All of these tests can
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor also be prefixed by an exclamation mark ('!') to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor negate their meaning.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>You can also set special flags for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>CondPattern</em> by appending
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong><code>[</code><em>flags</em><code>]</code></strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor as the third argument to the <code>RewriteCond</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor directive, where <em>flags</em> is a comma-separated list of any of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor following flags:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong><code>nocase|NC</code></strong>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<strong>n</strong>o <strong>c</strong>ase)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This makes the test case-insensitive - differences
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor between 'A-Z' and 'a-z' are ignored, both in the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor expanded <em>TestString</em> and the <em>CondPattern</em>.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This flag is effective only for comparisons between
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>TestString</em> and <em>CondPattern</em>. It has no
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor effect on filesystem and subrequest checks.</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<strong><code>ornext|OR</code></strong>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<strong>or</strong> next condition)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Use this to combine rule conditions with a local OR
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor instead of the implicit AND. Typical example:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteCond %{REMOTE_HOST} ^host1.* [OR]
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteCond %{REMOTE_HOST} ^host2.* [OR]
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteCond %{REMOTE_HOST} ^host3.*
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteRule ...some special stuff for any of these hosts...
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Without this flag you would have to write the condition/rule
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor pair three times.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>'<strong><code>novary|NV</code></strong>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<strong>n</strong>o <strong>v</strong>ary)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor If a HTTP header is used in the condition, this flag prevents
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor this header from being added to the Vary header of the response. <br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Using this flag might break proper caching of the response if
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the representation of this response varies on the value of this header.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor So this flag should be only used if the meaning of the Vary header
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is well understood.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ul>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ol>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><strong>Example:</strong></p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>To rewrite the Homepage of a site according to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>User-Agent:</code>'' header of the request, you can
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor use the following: </p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteRule ^/$ /homepage.max.html [L]
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteCond %{HTTP_USER_AGENT} ^Lynx.*
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteRule ^/$ /homepage.min.html [L]
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorRewriteRule ^/$ /homepage.std.html [L]
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Explanation: If you use a browser which identifies itself
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor as 'Mozilla' (including Netscape Navigator, Mozilla etc), then you
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor get the max homepage (which could include frames, or other special
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor features).
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor If you use the Lynx browser (which is terminal-based), then
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor you get the min homepage (which could be a version designed for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor easy, text-only browsing).
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor If neither of these conditions apply (you use any other browser,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor or your browser identifies itself as something non-standard), you get
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the std (standard) homepage.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<name>RewriteRule</name>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<description>Defines rules for the rewriting engine</description>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<syntax>RewriteRule
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>Pattern</em> <em>Substitution</em> [<em>flags</em>]</syntax>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<contextlist><context>server config</context><context>virtual host</context>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<context>directory</context><context>.htaccess</context></contextlist>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<override>FileInfo</override>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <directive>RewriteRule</directive> directive is the real
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting workhorse. The directive can occur more than once,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor with each instance defining a single rewrite rule. The
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor order in which these rules are defined is important - this is the order
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor in which they will be applied at run-time.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><a id="patterns" name="patterns"><em>Pattern</em></a> is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor a perl compatible <a id="regexp" name="regexp">regular
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor expression</a>. On the first RewriteRule it is applied to the (%-encoded)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <a href="/directive-dict.html#Syntax">URL-path</a> of the request;
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor subsequent patterns are applied to the output of the last matched
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteRule.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><title>What is matched?</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <em>Pattern</em> will initially be matched against the part of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URL after the hostname and port, and before the query string. If you wish
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to match against the hostname, port, or query string, use a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive module="mod_rewrite">RewriteCond</directive> with the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, or
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{QUERY_STRING}</code> variables respectively.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>For some hints on <glossary ref="regex">regular
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor expressions</glossary>, see
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the <a href="/rewrite/rewrite_intro.html#regex">mod_rewrite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Introduction</a>.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>In mod_rewrite, the NOT character
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ('<code>!</code>') is also available as a possible pattern
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor prefix. This enables you to negate a pattern; to say, for instance:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<em>if the current URL does <strong>NOT</strong> match this
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor pattern</em>''. This can be used for exceptional cases, where
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor it is easier to match the negative pattern, or as a last
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor default rule.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><title>Note</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorWhen using the NOT character to negate a pattern, you cannot include
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorgrouped wildcard parts in that pattern. This is because, when the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorpattern does NOT match (ie, the negation matches), there are no
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorcontents for the groups. Thus, if negated patterns are used, you
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorcannot use <code>$N</code> in the substitution string!
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <a id="rhs" name="rhs"><em>Substitution</em></a> of a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewrite rule is the string that replaces the original URL-path that
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor was matched by <em>Pattern</em>. The <em>Substitution</em> may
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor be a:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dl>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>file-system path</dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>Designates the location on the file-system of the resource
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to be delivered to the client.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>URL-path</dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>A <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor module="core">DocumentRoot</directive>-relative path to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor resource to be served. Note that <module>mod_rewrite</module>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor tries to guess whether you have specified a file-system path
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor or a URL-path by checking to see if the first segment of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor path exists at the root of the file-system. For example, if
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor you specify a <em>Substitution</em> string of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>/www/file.html</code>, then this will be treated as a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URL-path <em>unless</em> a directory named <code>www</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor exists at the root or your file-system, in which case it will
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor be treated as a file-system path. If you wish other
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URL-mapping directives (such as <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor module="mod_alias">Alias</directive>) to be applied to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor resulting URL-path, use the <code>[PT]</code> flag as
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor described below.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>Absolute URL</dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>If an absolute URL is specified,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <module>mod_rewrite</module> checks to see whether the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor hostname matches the current host. If it does, the scheme and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor hostname are stripped out and the resulting path is treated as
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor a URL-path. Otherwise, an external redirect is performed for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the given URL. To force an external redirect back to the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor current host, see the <code>[R]</code> flag below.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt><code>-</code> (dash)</dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd>A dash indicates that no substitution should be performed
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (the existing path is passed through untouched). This is used
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor when a flag (see below) needs to be applied without changing
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the path.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dl>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>In addition to plain text, the <em>Substition</em> string can include</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <ol>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>back-references (<code>$N</code>) to the RewriteRule
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor pattern</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>back-references (<code>%N</code>) to the last matched
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteCond pattern</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li>server-variables as in rule condition test-strings
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<code>%{VARNAME}</code>)</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <li><a href="#mapfunc">mapping-function</a> calls
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<code>${mapname:key|default}</code>)</li>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </ol>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Back-references are identifiers of the form
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>$</code><strong>N</strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<strong>N</strong>=0..9), which will be replaced
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor by the contents of the <strong>N</strong>th group of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor matched <em>Pattern</em>. The server-variables are the same
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor as for the <em>TestString</em> of a <code>RewriteCond</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor directive. The mapping-functions come from the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>RewriteMap</code> directive and are explained there.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor These three types of variables are expanded in the order above.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>As already mentioned, all rewrite rules are
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor applied to the <em>Substitution</em> (in the order in which
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor they are defined
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor in the config file). The URL is <strong>completely
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor replaced</strong> by the <em>Substitution</em> and the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting process continues until all rules have been applied,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor or it is explicitly terminated by a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code><strong>L</strong></code> flag.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <note><title>Modifying the Query String</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>By default, the query string is passed through unchanged. You
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor can, however, create URLs in the substitution string containing
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor a query string part. Simply use a question mark inside the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor substitution string to indicate that the following text should
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor be re-injected into the query string. When you want to erase an
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor existing query string, end the substitution string with just a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor question mark. To combine new and old query strings, use the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>[QSA]</code> flag.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Additionally you can set special <a name="rewriteflags"
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor id="rewriteflags">actions</a> to be performed by
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor appending <strong><code>[</code><em>flags</em><code>]</code></strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor as the third argument to the <code>RewriteRule</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor directive. <em>Flags</em> is a comma-separated list, surround by square
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor brackets, of any of the following flags: </p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dl>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>B</code>' (escape backreferences)</dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dd><p>Apache has to unescape URLs before mapping them,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor so backreferences will be unescaped at the time they are applied.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Using the B flag, non-alphanumeric characters in backreferences
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor will be escaped. For example, consider the rule:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteRule ^(/.*)$ /index.php?show=$1
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This will map <code>/C++</code> to <code>/index.php?show=/C++</code>.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor But it will also map <code>/C%2b%2b</code> to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>/index.php?show=/C++</code>, because the <code>%2b</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor has been unescaped. With the B flag, it will instead map to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>/index.php?show=/C%2b%2b</code>.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This escaping is particularly necessary in a proxy situation,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor when the backend may break if presented with an unescaped URL.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>chain|C</code>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (chained with next rule)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This flag chains the current rule with the next rule
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (which itself can be chained with the following rule,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor and so on). This has the following effect: if a rule
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor matches, then processing continues as usual -
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the flag has no effect. If the rule does
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>not</strong> match, then all following chained
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rules are skipped. For instance, it can be used to remove the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>.www</code>'' part, inside a per-directory rule set,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor when you let an external redirect happen (where the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>.www</code>'' part should not occur!).</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>cookie|CO=</code><em>NAME</em>:<em>VAL</em>:<em>domain</em>[:<em>lifetime</em>[:<em>path</em>[:<em>secure</em>[:<em>httponly</em>]]]]'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (set cookie)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This sets a cookie in the client's browser. The cookie's name
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is specified by <em>NAME</em> and the value is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>VAL</em>. The <em>domain</em> field is the domain of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor cookie, such as '.apache.org', the optional <em>lifetime</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is the lifetime of the cookie in minutes (0 means expires at end
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor of session), and the optional
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>path</em> is the path of the cookie. If <em>secure</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is set to 'secure', 'true' or '1', the cookie is only transmitted via secured
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor connections. If <em>httponly</em> is set to 'HttpOnly', 'true' or '1', the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>HttpOnly</code> flag is used, making the cookie inaccessible
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to JavaScript code on browsers that support this feature.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>discardpathinfo|DPI'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (discard PATH_INFO)</code></dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>In per-directory context, the URI each <directive>RewriteRule</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor compares against is the concatenation of the current values of the URI
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor and PATH_INFO.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The current URI can be the initial URI as requested by the client, the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor result of a previous round of mod_rewrite processing, or the result of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor a prior rule in the current round of mod_rewrite processing.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>In contrast, the PATH_INFO that is appended to the URI before each
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rule reflects only the value of PATH_INFO before this round of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor mod_rewrite processing. As a consequence, if large portions
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor of the URI are matched and copied into a substitution in multiple
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive>RewriteRule</directive> directives, without regard for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor which parts of the URI came from the current PATH_INFO, the final
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URI may have multiple copies of PATH_INFO appended to it.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Use this flag on any substitution where the PATH_INFO that resulted
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor from the previous mapping of this request to the filesystem is not of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor interest. This flag permanently forgets the PATH_INFO established
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor before this round of mod_rewrite processing began. PATH_INFO will
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor not be recalculated until the current round of mod_rewrite processing
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor completes. Subsequent rules during this round of processing will see
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor only the direct result of substitutions, without any PATH_INFO
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor appended.</p></dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>env|E=</code><em>VAR</em>:<em>VAL</em>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (set environment variable)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This forces an environment variable named <em>VAR</em> to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor be set to the value <em>VAL</em>, where <em>VAL</em> can
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor contain regexp backreferences (<code>$N</code> and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%N</code>) which will be expanded. You can use this
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor flag more than once, to set more than one variable. The
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor variables can later be dereferenced in many situations, most commonly
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor from within XSSI (via <code>&lt;!--#echo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor var="VAR"--&gt;</code>) or CGI (<code>$ENV{'VAR'}</code>).
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor You can also dereference the variable in a later RewriteCond pattern, using
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>%{ENV:VAR}</code>. Use this to strip
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor information from URLs, while maintaining a record of that information.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>forbidden|F</code>' (force URL
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to be forbidden)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This forces the current URL to be forbidden - it immediately
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sends back a HTTP response of 403 (FORBIDDEN).
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Use this flag in conjunction with
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor appropriate RewriteConds to conditionally block some
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URLs.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>gone|G</code>' (force URL to be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor gone)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This forces the current URL to be gone - it
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor immediately sends back a HTTP response of 410 (GONE). Use
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor this flag to mark pages which no longer exist as gone.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>handler|H</code>=<em>Content-handler</em>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (force Content handler)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Force the Content-handler of the target file to be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>Content-handler</em>. For instance, this can be used to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor simulate the <module>mod_alias</module> directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive module="mod_alias">ScriptAlias</directive>,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor which internally forces all files
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor inside the mapped directory to have a handler of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>cgi-script</code>''.<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor If used in per-directory context, there must not be a substitution
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor which changes the path. Use this flag in per-directory context only
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor with <code>-</code> (dash) as the substitution, otherwise the request
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor will fail.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>last|L</code>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (last rule)</dt><dd> Stop the rewriting process
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor here and don't apply any more rewrite rules. This corresponds
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to the Perl <code>last</code> command or the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>break</code> command in C. Use this flag to prevent the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor currently rewritten URL from being rewritten further by
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor following rules. Remember, however, that if the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive>RewriteRule</directive> generates an internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor redirect (which frequently occurs when rewriting in a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor per-directory context), this will reinject the request and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor will cause processing to be repeated starting from the first
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <directive>RewriteRule</directive>.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>next|N</code>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (next round)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Re-run the rewriting process (starting again with the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor first rewriting rule). This time, the URL to match is no longer
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the original URL, but rather the URL returned by the last rewriting rule.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This corresponds to the Perl <code>next</code> command or
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the <code>continue</code> command in C. Use
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor this flag to restart the rewriting process -
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to immediately go to the top of the loop.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>Be careful not to create an infinite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor loop!</strong></dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>nocase|NC</code>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (no case)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This makes the <em>Pattern</em> case-insensitive,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ignoring difference between 'A-Z' and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor 'a-z' when <em>Pattern</em> is matched against the current
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URL.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>noescape|NE</code>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (no URI escaping of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor output)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This flag prevents mod_rewrite from applying the usual URI
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor escaping rules to the result of a rewrite. Ordinarily,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor special characters (such as '%', '$', ';', and so on)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor will be escaped into their hexcode equivalents ('%25',
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '%24', and '%3B', respectively); this flag prevents this
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor from happening. This allows percent symbols to appear in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the output, as in
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteRule ^/foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor which would turn '<code>/foo/zed</code>' into a safe
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor request for '<code>/bar?arg=P1=zed</code>'.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>nosubreq|NS</code>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (not for internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sub-requests)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>This flag forces the rewriting engine to skip a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting rule if the current request is an internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sub-request. For instance, sub-requests occur internally
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor in Apache when <module>mod_dir</module> tries to find out
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor information about possible directory default files
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<code>index.xxx</code> files). On sub-requests it is not
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor always useful, and can even cause errors, if
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the complete set of rules are applied. Use this flag to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor exclude some rules.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>To decide whether or not to use this rule: if you
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor prefix URLs with CGI-scripts, to force them to be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor processed by the CGI-script, it's likely that you
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor will run into problems (or significant overhead) on
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sub-requests. In these cases, use this flag.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>proxy|P</code>' (force
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor proxy)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This flag forces the substitution part to be internally
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sent as a proxy request and immediately (rewrite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor processing stops here) put through the <a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor href="mod_proxy.html">proxy module</a>. You must make
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor sure that the substitution string is a valid URI
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (typically starting with
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>http://</code><em>hostname</em>) which can be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor handled by the Apache proxy module. If not, you will get an
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor error from the proxy module. Use this flag to achieve a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor more powerful implementation of the <a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor href="mod_proxy.html#proxypass">ProxyPass</a> directive,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to map remote content into the namespace of the local
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor server.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Note: <module>mod_proxy</module> must be enabled in order
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor to use this flag.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>passthrough|PT</code>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (pass through to next
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor handler)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This flag forces the rewrite engine to set the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>uri</code> field of the internal
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>request_rec</code> structure to the value of the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>filename</code> field. This flag is just a hack to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor enable post-processing of the output of
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>RewriteRule</code> directives, using
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>Alias</code>, <code>ScriptAlias</code>,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>Redirect</code>, and other directives from
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor various URI-to-filename translators. For example, to rewrite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>/abc</code> to <code>/def</code> using
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <module>mod_rewrite</module>, and then
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>/def</code> to <code>/ghi</code> using
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <module>mod_alias</module>:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor RewriteRule ^/abc(.*) /def$1 [PT]<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Alias /def /ghi
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</example>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor If you omit the <code>PT</code> flag,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>mod_rewrite</code> will rewrite
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>uri=/abc/...</code> to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>filename=/def/...</code> as a full API-compliant
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URI-to-filename translator should do. Then
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>mod_alias</code> will try to do a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URI-to-filename transition, which will fail.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Note: <strong>You must use this flag if you want to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor mix directives from different modules which allow
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor URL-to-filename translators</strong>. The typical example
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is the use of <module>mod_alias</module> and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <module>mod_rewrite</module>.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>The <code>PT</code> flag implies the <code>L</code> flag:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting will be stopped in order to pass the request to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the next phase of processing.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>qsappend|QSA</code>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (query string
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor append)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This flag forces the rewrite engine to append a query
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor string part of the substitution string to the existing string,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor instead of replacing it. Use this when you want to add more
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor data to the query string via a rewrite rule.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>redirect|R</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor [=<em>code</em>]' (force <a id="redirect"
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor name="redirect">redirect</a>)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Prefix <em>Substitution</em> with
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>http://thishost[:thisport]/</code> (which makes the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor new URL a URI) to force a external redirection. If no
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>code</em> is given, a HTTP response of 302 (MOVED
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor TEMPORARILY) will be returned. If you want to use other
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor response codes, simply specify the appropriate number or use
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor one of the following symbolic names: <code>temp</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (default), <code>permanent</code>,
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>seeother</code>. Use this for rules to canonicalize
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor the URL and return it to the client - to translate
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor ``<code>/~</code>'' into ``<code>/u/</code>'', or to always
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor append a slash to <code>/u/</code><em>user</em>, etc.<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <strong>Note:</strong> When you use this flag, make sure
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor that the substitution field is a valid URL! Otherwise, you
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor will be redirecting to an invalid location. Remember that
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor this flag on its own will only prepend
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>http://thishost[:thisport]/</code> to the URL, and
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting will continue. Usually, you will want to stop
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting at this point, and redirect immediately. To stop
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor rewriting, you should add the 'L' flag.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>While this is typically used for redirects, any valid status
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor code can be given here. If the status code is outside the redirect
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor range (300-399), then the <em>Substitution</em> string is dropped
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor and rewriting is stopped as if the <code>L</code> flag was
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor used.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>'<code>skip|S</code>=<em>num</em>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (skip next rule(s))</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor This flag forces the rewriting engine to skip the next
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>num</em> rules in sequence, if the current rule
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor matches. Use this to make pseudo if-then-else constructs:
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor The last rule of the then-clause becomes
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>skip=N</code>, where N is the number of rules in the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor else-clause. (This is <strong>not</strong> the same as the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor 'chain|C' flag!)</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <dt>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor '<code>type|T</code>=<em>MIME-type</em>'
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (force MIME type)</dt><dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor Force the <glossary>MIME-type</glossary> of the target file to be
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <em>MIME-type</em>. This can be used to
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor set up the content-type based on some conditions.
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor If used in per-directory context, use only <code>-</code> (dash)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor as the substitution, otherwise the MIME-type set with this flag
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor is lost due to an internal re-processing.</dd>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </dl>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><title>Home directory expansion</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<p> When the substitution string begins with a string
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorresembling "/~user" (via explicit text or backreferences), mod_rewrite performs
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorhome directory expansion independent of the presence or configuration
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorof <module>mod_userdir</module>.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<p> This expansion does not occur when the <em>PT</em>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorflag is used on the <directive module="mod_rewrite">RewriteRule</directive>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzordirective.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><title>Per-directory Rewrites</title>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<p>The rewrite engine may be used in <a
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorhref="/howto/htaccess.html">.htaccess</a> files. To enable the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorrewrite engine for these files you need to set
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor"<code>RewriteEngine On</code>" <strong>and</strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor"<code>Options FollowSymLinks</code>" must be enabled. If your
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzoradministrator has disabled override of <code>FollowSymLinks</code> for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzora user's directory, then you cannot use the rewrite engine. This
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorrestriction is required for security reasons.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<p>When using the rewrite engine in <code>.htaccess</code> files the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorper-directory prefix (which always is the same for a specific
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzordirectory) is automatically <em>removed</em> for the pattern matching
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorand automatically <em>added</em> after the substitution has been
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzordone. This feature is essential for many sorts of rewriting; without
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorthis, you would always have to match the parent directory, which is
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzornot always possible. There is one exception: If a substitution string
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorstarts with <code>http://</code>, then the directory prefix will
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<strong>not</strong> be added, and an external redirect (or proxy
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorthroughput, if using flag <strong>P</strong>) is forced. See the
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<directive module="mod_rewrite">RewriteBase</directive> directive for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzormore information.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<p>The rewrite engine may also be used in <directive type="section"
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzormodule="core">Directory</directive> sections with the same
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorprefix-matching rules as would be applied to <code>.htaccess</code>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorfiles. It is usually simpler, however, to avoid the prefix substitution
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorcomplication by putting the rewrite rules in the main server or
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorvirtual host context, rather than in a <directive type="section"
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzormodule="core">Directory</directive> section.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<p>Although rewrite rules are syntactically permitted in <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzortype="section" module="core">Location</directive> and <directive
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzortype="section" module="core">Files</directive> sections, this
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzorshould never be necessary and is unsupported.</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p>Here are all possible substitution combinations and their
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor meanings:</p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><strong>Inside per-server configuration
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<code>httpd.conf</code>)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor for request ``<code>GET
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /somepath/pathinfo</code>'':</strong><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<strong>Given Rule</strong> <strong>Resulting Substitution</strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor---------------------------------------------- ----------------------------------
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) otherpath$1 invalid, not supported
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) otherpath$1 [R] invalid, not supported
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) otherpath$1 [P] invalid, not supported
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor---------------------------------------------- ----------------------------------
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) /otherpath$1 /otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) /otherpath$1 [P] doesn't make sense, not supported
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor---------------------------------------------- ----------------------------------
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) http://thishost/otherpath$1 [P] doesn't make sense, not supported
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor---------------------------------------------- ----------------------------------
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (the [R] flag is redundant)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via internal proxy
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre></note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <p><strong>Inside per-directory configuration for
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>/somepath</code><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (<code>/physical/path/to/somepath/.htacccess</code>, with
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor <code>RewriteBase /somepath</code>)<br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor for request ``<code>GET
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor /somepath/localpath/pathinfo</code>'':</strong><br />
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </p>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<note><pre>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor<strong>Given Rule</strong> <strong>Resulting Substitution</strong>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor---------------------------------------------- ----------------------------------
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) otherpath$1 /somepath/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) otherpath$1 [R] http://thishost/somepath/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) otherpath$1 [P] doesn't make sense, not supported
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor---------------------------------------------- ----------------------------------
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) /otherpath$1 /otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) /otherpath$1 [P] doesn't make sense, not supported
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor---------------------------------------------- ----------------------------------
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) http://thishost/otherpath$1 [P] doesn't make sense, not supported
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor---------------------------------------------- ----------------------------------
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via external redirection
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor (the [R] flag is redundant)
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor via internal proxy
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</pre></note>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </usage>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor </directivesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor</modulesynopsis>
dc3a272f8afcbc137adcfee4c3aa052d2bdf4df7gryzor