remapping.xml revision 6896b3498e144d33f374efe93e6bab2669af535f
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<?xml-stylesheet type="text/xsl" href="/style/manual.en.xsl"?>
6896b3498e144d33f374efe93e6bab2669af535fnd<!-- $LastChangedRevision$ -->
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 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<title>Redirecting and Remapping with mod_rewrite</title>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<p>This document supplements the <module>mod_rewrite</module>
2bb0656f94af82b1ff5e3e77a99b4427c52e4953rbowen<a href="/mod/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<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
4a1711ab536d965e63d7be80e29f912287fe70b2rbowenconfiguration.</note>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<seealso><a href="/mod/mod_rewrite.html">Module documentation</a></seealso>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<seealso><a href="intro.html">mod_rewrite introduction</a></seealso>
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<!--<seealso><a href="remapping.html">Redirection and remapping</a></seealso>-->
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen<seealso><a href="access.html">Controlling access</a></seealso>
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowen<seealso><a href="vhosts.html">Virtual hosts</a></seealso>
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowen<seealso><a href="advanced.html">Advanced techniques and tricks</a></seealso>
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowen<seealso><a href="avoid.html">When not to use mod_rewrite</a></seealso>
10705fbc225dcf590c9ba24a4f04de221358060arbowen <p>Assume we have recently renamed the page
10705fbc225dcf590c9ba24a4f04de221358060arbowen <code>foo.html</code> to <code>bar.html</code> and now want
3723c5ef4beec0403b4daa6c64fc0a8f53541018rbowen to provide the old URL for backward compatibility. However,
8b79a240383bcecf28b75d4803683a7d101d2713rbowen we want that users of the old URL even not recognize that
10705fbc225dcf590c9ba24a4f04de221358060arbowen the pages was renamed - that is, we don't want the address to
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen change in their browser.</p>
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen <p>We rewrite the old URL to the new one internally via the
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen following rule:</p>
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowenRewriteEngine on
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowenRewriteRule ^<strong>/old</strong>\.html$ <strong>/new</strong>.html [PT]
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen <p>Assume again that we have recently renamed the page
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen <code>foo.html</code> to <code>bar.html</code> and now want
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen to provide the old URL for backward compatibility. But this
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen time we want that the users of the old URL get hinted to
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen the new one, i.e. their browsers Location field should
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen change, too.</p>
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen <p>We force a HTTP redirect to the new URL which leads to a
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen change of the browsers and thus the users view:</p>
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowenRewriteEngine on
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowenRewriteRule ^<strong>/foo</strong>\.html$ <strong>bar</strong>.html [<strong>R</strong>]
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen href="#old-to-new-intern">internal</a> example above, we can simply
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen use the Redirect directive. mod_rewrite was used in that earlier
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen example in order to hide the redirect from the client:</p>
817e2217798a69597ab1da450376abac7b239814rbowen <p>If a resource has moved to another server, you may wish to have
817e2217798a69597ab1da450376abac7b239814rbowen URLs continue to work for a time on the old server while people
817e2217798a69597ab1da450376abac7b239814rbowen update their bookmarks.</p>
817e2217798a69597ab1da450376abac7b239814rbowen <p>You can use <module>mod_rewrite</module> to redirect these URLs
817e2217798a69597ab1da450376abac7b239814rbowen to the new server, but you might also consider using the Redirect
817e2217798a69597ab1da450376abac7b239814rbowen or RedirectMatch directive.</p>
817e2217798a69597ab1da450376abac7b239814rbowenRewriteEngine on
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowenRewriteRule ^/docs/(.+) http://new.example.com/docs/$1 [R,L]
1570744e45f66e479e87117f23048c44712a31bcrbowenRedirectMatch ^/docs/(.*) http://new.example.com/docs/$1
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen <p>How can we transform a static page
cd16bb1940b0d07b466ac46b9be3f1bba7ce62ffrbowen <code>foo.cgi</code> in a seamless way, i.e. without notice
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowen <p>We just rewrite the URL to the CGI-script and force the
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowen handler to be <strong>cgi-script</strong> so that it is
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowen executed as a CGI program.
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowen internally leads to the invocation of
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowenRewriteEngine on
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowenRewriteBase /~quux/
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowenRewriteRule ^foo\.<strong>html</strong>$ foo.<strong>cgi</strong> [H=<strong>cgi-script</strong>]
7ed90ff2ffacbd64549ed58890e0e44dbd2b2a49rbowen <title>Backward Compatibility for file extension change</title>
cd16bb1940b0d07b466ac46b9be3f1bba7ce62ffrbowen <p>How can we make URLs backward compatible (still
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen existing virtually) after migrating <code>document.YYYY</code>
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen to <code>document.XXXX</code>, e.g. after translating a
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen bunch of <code>.html</code> files to <code>.php</code>?</p>
da15e975ccc42c6c1f1d9a9b30d47fa1bd0b6a48rbowen <p>We rewrite the name to its basename and test for
da15e975ccc42c6c1f1d9a9b30d47fa1bd0b6a48rbowen existence of the new extension. If it exists, we take
da15e975ccc42c6c1f1d9a9b30d47fa1bd0b6a48rbowen that name, else we rewrite the URL to its original state.</p>
c7f365f090f1a2ddb14059d75e223ecfc4ae0eb4rbowen# backward compatibility ruleset for
da15e975ccc42c6c1f1d9a9b30d47fa1bd0b6a48rbowen# when and only when document.php exists
454f7910368c351cca3f92ec75935df177f333a5rbowenRewriteEngine on
da15e975ccc42c6c1f1d9a9b30d47fa1bd0b6a48rbowenRewriteCond $1.php -f
da15e975ccc42c6c1f1d9a9b30d47fa1bd0b6a48rbowenRewriteCond $1.html !-f
da15e975ccc42c6c1f1d9a9b30d47fa1bd0b6a48rbowenRewriteRule ^(.*).html$ $1.php
da15e975ccc42c6c1f1d9a9b30d47fa1bd0b6a48rbowen</Directory>
5bfbe6eab78fa063a7de24cea3262293fcd5499erbowen <p>This example uses an often-overlooked feature of mod_rewrite,
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen by taking advantage of the order of execution of the ruleset. In
4a1711ab536d965e63d7be80e29f912287fe70b2rbowen particular, mod_rewrite evaluates the left-hand-side of the
9e4fd920b1e57cb1a7113cde0959b9ff1689d1dfrbowen RewriteRule before it evaluates the RewriteCond directives.
RewriteRule ^/?(.*) http://www.example.com:%{SERVER_PORT}/$1 [L,R,NE]
RewriteRule ^/?(.*) http://www.example.com/$1 [L,R,NE]
RewriteRule ^/?(.*) http://www.%{HTTP_HOST}/$1 [L,R,NE]
# ...and if found stop and be happy:
# ...and if found stop and be happy:
## map.mirrors -- Multiplexing Map
RedirectMatch ^/$ http://example.com/about/
FallbackResource index.php
RewriteRule ^ index.php [PT]
RewriteRule (.*) index.php?$1 [PT,QSA]