remapping.xml revision aa3ddf73a3cb180f88a18742f363f2cb9a0c5cde
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<?xml version="1.0" encoding="UTF-8" ?>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<!DOCTYPE manualpage SYSTEM "/style/manualpage.dtd">
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<?xml-stylesheet type="text/xsl" href="/style/manual.en.xsl"?>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<!-- $LastChangedRevision: 832069 $ -->
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<!--
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen Licensed to the Apache Software Foundation (ASF) under one or more
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen contributor license agreements. See the NOTICE file distributed with
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen this work for additional information regarding copyright ownership.
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen The ASF licenses this file to You under the Apache License, Version 2.0
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen (the "License"); you may not use this file except in compliance with
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen the License. You may obtain a copy of the License at
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen http://www.apache.org/licenses/LICENSE-2.0
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen Unless required by applicable law or agreed to in writing, software
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen distributed under the License is distributed on an "AS IS" BASIS,
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen See the License for the specific language governing permissions and
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen limitations under the License.
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen-->
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<manualpage metafile="remapping.xml.meta">
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen <parentdocument href="./">Rewrite</parentdocument>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<title>Redirecting and Remapping with mod_rewrite</title>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<summary>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<p>This document supplements the <module>mod_rewrite</module>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<a href="/mod_rewrite.html">reference documentation</a>. It describes
4a1711ab536d965e63d7be80e29f912287fe70b2rbowenhow you can use <module>mod_rewrite</module> to redirect and remap
4a1711ab536d965e63d7be80e29f912287fe70b2rbowenrequest. This includes many examples of common uses of mod_rewrite,
4a1711ab536d965e63d7be80e29f912287fe70b2rbowenincluding detailed descriptions of how each works.</p>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<note type="warning">Note that many of these examples won't work unchanged in your
4a1711ab536d965e63d7be80e29f912287fe70b2rbowenparticular server configuration, so it's important that you understand
4a1711ab536d965e63d7be80e29f912287fe70b2rbowenthem, rather than merely cutting and pasting the examples into your
1a1f0f42c4b3840641897888fec7792af8ba384frbowenconfiguration.</note>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen</summary>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<seealso><a href="/mod/mod_rewrite.html">Module documentation</a></seealso>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<seealso><a href="intro.html">mod_rewrite introduction</a></seealso>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<section id="old-to-new">
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <title>From Old to New (internal)</title>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dl>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dt>Description:</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>Assume we have recently renamed the page
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <code>foo.html</code> to <code>bar.html</code> and now want
1a1f0f42c4b3840641897888fec7792af8ba384frbowen to provide the old URL for backward compatibility. However,
1a1f0f42c4b3840641897888fec7792af8ba384frbowen we want that users of the old URL even not recognize that
1a1f0f42c4b3840641897888fec7792af8ba384frbowen the pages was renamed - that is, we don't want the address to
1a1f0f42c4b3840641897888fec7792af8ba384frbowen change in their browser.</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dt>Solution:</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>We rewrite the old URL to the new one internally via the
1a1f0f42c4b3840641897888fec7792af8ba384frbowen following rule:</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<example><pre>
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteEngine on
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteRule ^<strong>/old</strong>\.html$ <strong>/new</strong>.html [PT]
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</pre></example>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dl>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</section>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<section id="old-to-new-extern">
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <title>Rewriting From Old to New (external)</title>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dl>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dt>Description:</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>Assume again that we have recently renamed the page
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <code>foo.html</code> to <code>bar.html</code> and now want
1a1f0f42c4b3840641897888fec7792af8ba384frbowen to provide the old URL for backward compatibility. But this
1a1f0f42c4b3840641897888fec7792af8ba384frbowen time we want that the users of the old URL get hinted to
1a1f0f42c4b3840641897888fec7792af8ba384frbowen the new one, i.e. their browsers Location field should
1a1f0f42c4b3840641897888fec7792af8ba384frbowen change, too.</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dt>Solution:</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>We force a HTTP redirect to the new URL which leads to a
1a1f0f42c4b3840641897888fec7792af8ba384frbowen change of the browsers and thus the users view:</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<example><pre>
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteEngine on
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteRule ^<strong>/foo</strong>\.html$ <strong>bar</strong>.html [<strong>R</strong>]
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</pre></example>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<dt>Discussion</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>In this example, as contrasted to the <a
1a1f0f42c4b3840641897888fec7792af8ba384frbowen href="#old-to-new-intern">internal</a> example above, we can simply
1a1f0f42c4b3840641897888fec7792af8ba384frbowen use the Redirect directive. mod_rewrite was used in that earlier
1a1f0f42c4b3840641897888fec7792af8ba384frbowen example in order to hide the redirect from the client:</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <example>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen Redirect /foo.html /bar.html
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </example>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dl>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</section>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<section id="static-to-dynamic">
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <title>From Static to Dynamic</title>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dl>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dt>Description:</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>How can we transform a static page
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <code>foo.html</code> into a dynamic variant
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <code>foo.cgi</code> in a seamless way, i.e. without notice
1a1f0f42c4b3840641897888fec7792af8ba384frbowen by the browser/user.</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dt>Solution:</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>We just rewrite the URL to the CGI-script and force the
1a1f0f42c4b3840641897888fec7792af8ba384frbowen handler to be <strong>cgi-script</strong> so that it is
1a1f0f42c4b3840641897888fec7792af8ba384frbowen executed as a CGI program.
1a1f0f42c4b3840641897888fec7792af8ba384frbowen This way a request to <code>/~quux/foo.html</code>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen internally leads to the invocation of
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <code>/~quux/foo.cgi</code>.</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<example><pre>
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteEngine on
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteBase /~quux/
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteRule ^foo\.<strong>html</strong>$ foo.<strong>cgi</strong> [H=<strong>cgi-script</strong>]
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</pre></example>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dl>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</section>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen<section id="backward-compatibility">
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <title>Backward Compatibility for file extension change</title>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dl>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dt>Description:</dt>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <p>How can we make URLs backward compatible (still
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen existing virtually) after migrating <code>document.YYYY</code>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen to <code>document.XXXX</code>, e.g. after translating a
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen bunch of <code>.html</code> files to <code>.php</code>?</p>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen </dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dt>Solution:</dt>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <p>We rewrite the name to its basename and test for
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen existence of the new extension. If it exists, we take
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen that name, else we rewrite the URL to its original state.</p>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen<example><pre>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# backward compatibility ruleset for
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# rewriting document.html to document.php
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# when and only when document.php exists
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteEngine on
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteCond $1.php -f
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteCond $1.html !-f
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteRule ^(.*).html$ $1.php
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen</pre></example>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen </dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dt>Discussion</dt>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <p>This example uses an often-overlooked feature of mod_rewrite,
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen by taking advantage of the order of execution of the ruleset. In
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen particular, mod_rewrite evaluates the left-hand-side of the
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen RewriteRule before it evaluates the RewriteCond directives.
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen Consequently, $1 is already defined by the time the RewriteRule
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen directives are evaluated. This allows us to test for the existence
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen of the the original (<code>document.html</code>) and target
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen (<code>document.php</code>) files using the same base filename.</p>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen </dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen </dl>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen</section>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<section id="canonicalhost"><title>Canonical Hostnames</title>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dl>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dt>Description:</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>The goal of this rule is to force the use of a particular
1a1f0f42c4b3840641897888fec7792af8ba384frbowen hostname, in preference to other hostnames which may be used to
1a1f0f42c4b3840641897888fec7792af8ba384frbowen reach the same site. For example, if you wish to force the use
1a1f0f42c4b3840641897888fec7792af8ba384frbowen of <strong>www.example.com</strong> instead of
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <strong>example.com</strong>, you might use a variant of the
1a1f0f42c4b3840641897888fec7792af8ba384frbowen following recipe.</dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dt>Solution:</dt>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<p>For sites running on a port other than 80:</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<example><pre>
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteCond %{HTTP_HOST} !^$
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteCond %{SERVER_PORT} !^80$
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteRule ^/?(.*) http://www.example.com:%{SERVER_PORT}/$1 [L,R,NE]
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</pre></example>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<p>And for a site running on port 80</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<example><pre>
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteCond %{HTTP_HOST} !^$
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteRule ^/?(.*) http://www.example.com/$1 [L,R,NE]
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</pre></example>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen If you wanted to do this generically for all domain names - that
1a1f0f42c4b3840641897888fec7792af8ba384frbowen is, if you want to redirect <strong>example.com</strong> to
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <strong>www.example.com</strong> for all possible values of
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <strong>example.com</strong>, you could use the following
1a1f0f42c4b3840641897888fec7792af8ba384frbowen recipe:</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen<example><pre>
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteCond %{HTTP_HOST} !^www\. [NC]
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteCond %{HTTP_HOST} !^$
1a1f0f42c4b3840641897888fec7792af8ba384frbowenRewriteRule ^/?(.*) http://www.%{HTTP_HOST}/$1 [L,R,NE]
1a1f0f42c4b3840641897888fec7792af8ba384frbowen</pre></example>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
1a1f0f42c4b3840641897888fec7792af8ba384frbowen <p>These rulesets will work either in your main server configuration
1a1f0f42c4b3840641897888fec7792af8ba384frbowen file, or in a <code>.htaccess</code> file placed in the <directive
1a1f0f42c4b3840641897888fec7792af8ba384frbowen module="core">DocumentRoot</directive> of the server.</p>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dd>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen </dl>
1a1f0f42c4b3840641897888fec7792af8ba384frbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen</section>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen<section id="multipledirs">
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <title>Search for pages in more than one directory</title>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dl>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dt>Description:</dt>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <p>A particular resource might exist in one of several places, and
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen we want to look in those places for the resource when it is
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen requested. Perhaps we've recently rearranged our directory
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen structure, dividing content into several locations.</p>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen </dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dt>Solution:</dt>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen <p>The following ruleset searches in two directories to find the
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen resource, and, if not finding it in either place, will attempt to
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen just serve it out of the location requested.</p>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen<example><pre>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteEngine on
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# first try to find it in dir1/...
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# ...and if found stop and be happy:
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteCond %{DOCUMENT_ROOT}/<strong>dir1</strong>/%{REQUEST_URI} -f
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteRule ^(.+) %{DOCUMENT_ROOT}/<strong>dir1</strong>/$1 [L]
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# second try to find it in dir2/...
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# ...and if found stop and be happy:
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteCond %{DOCUMENT_ROOT}/<strong>dir2</strong>/%{REQUEST_URI} -f
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteRule ^(.+) %{DOCUMENT_ROOT}/<strong>dir2</strong>/$1 [L]
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# else go on for other Alias or ScriptAlias directives,
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen# etc.
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowenRewriteRule ^(.+) - [PT]
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen</pre></example>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen </dd>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen </dl>
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen
13e125c14cbafff43783b7f3aed11de6d4cb5b14rbowen</section>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen<section id="archive-access-multiplexer">
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <title>Redirecting to Geographically Distributed Servers</title>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <dl>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <dt>Description:</dt>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <dd>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <p>We have numerous mirrors of our website, and want to redirect
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen people to the one that is located in the country where they are
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen located.</p>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen </dd>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <dt>Solution:</dt>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <dd>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <p>Looking at the hostname of the requesting client, we determine
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen which country they are coming from. If we can't do a lookup on their
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen IP address, we fall back to a default server.</p>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <p>We'll use <directive module="mod_rewrite">RewriteMap</directive>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen directive to build a list of servers that we wish to use.</p>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen<example><pre>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowenHostnameLookups on
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowenRewriteEngine on
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowenRewriteMap multiplex txt:/path/to/map.mirrors
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowenRewriteCond %{REMOTE_HOST} ([a-z]+)$ [NC]
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowenRewriteRule ^(.*)$ ${multiplex:<strong>%1</strong>|www.example.com}$1 [R,L]
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen</pre></example>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen<example><pre>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen## map.mirrors -- Multiplexing Map
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowende http://www.example.de/
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowenuk http://www.example.uk/
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowencom http://www.example.com/
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen##EOF##
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen</pre></example>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen </dd>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <dt>Discussion</dt>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <dd>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <note type="warning">This ruleset relies on
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <directive module="core">HostNameLookups</directive>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen being set <code>on</code>, which can be
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen a significant performance hit.</note>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen <p>The <directive module="mod_rewrite">RewriteCond</directive>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen directive captures the last portion of the hostname of the
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen requesting client - the country code - and the following RewriteRule
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen uses that value to look up the appropriate mirror host in the map
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen file.</p>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen </dd>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen </dl>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen</section>
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
aa3ddf73a3cb180f88a18742f363f2cb9a0c5cderbowen
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen</manualpage>