📄 rewrite_guide.html.en
字号:
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX This file is generated from xml source: DO NOT EDIT XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --><title>URL Rewriting Guide - Apache HTTP Server</title><link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /><link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /><link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link href="../images/favicon.ico" rel="shortcut icon" /></head><body id="manual-page"><div id="page-header"><p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p><p class="apache">Apache HTTP Server Version 2.0</p><img alt="" src="../images/feather.gif" /></div><div class="up"><a href="./index.html"><img title="<-" alt="<-" src="../images/left.gif" /></a></div><div id="path"><a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.0</a></div><div id="page-content"><div id="preamble"><h1>URL Rewriting Guide</h1><div class="toplang"><p><span>Available Languages: </span><a href="../en/rewrite/rewrite_guide.html" title="English"> en </a></p></div> <p>This document supplements the <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> <a href="../mod/mod_rewrite.html">reference documentation</a>. It describes how one can use Apache's <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> to solve typical URL-based problems with which webmasters are commonony confronted. We give detailed descriptions on how to solve each problem by configuring URL rewriting rulesets.</p> <div class="warning">ATTENTION: Depending on your server configuration it may be necessary to slightly change the examples for your situation, e.g. adding the <code>[PT]</code> flag when additionally using <code class="module"><a href="../mod/mod_alias.html">mod_alias</a></code> and <code class="module"><a href="../mod/mod_userdir.html">mod_userdir</a></code>, etc. Or rewriting a ruleset to fit in <code>.htaccess</code> context instead of per-server context. Always try to understand what a particular ruleset really does before you use it. This avoids many problems.</div> </div><div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#canonicalurl">Canonical URLs</a></li><li><img alt="" src="../images/down.gif" /> <a href="#canonicalhost">Canonical Hostnames</a></li><li><img alt="" src="../images/down.gif" /> <a href="#moveddocroot">Moved <code>DocumentRoot</code></a></li><li><img alt="" src="../images/down.gif" /> <a href="#trailingslash">Trailing Slash Problem</a></li><li><img alt="" src="../images/down.gif" /> <a href="#movehomedirs">Move Homedirs to Different Webserver</a></li><li><img alt="" src="../images/down.gif" /> <a href="#multipledirs">Search pages in more than one directory</a></li><li><img alt="" src="../images/down.gif" /> <a href="#setenvvars">Set Environment Variables According To URL Parts</a></li><li><img alt="" src="../images/down.gif" /> <a href="#uservhosts">Virtual User Hosts</a></li><li><img alt="" src="../images/down.gif" /> <a href="#redirecthome">Redirect Homedirs For Foreigners</a></li><li><img alt="" src="../images/down.gif" /> <a href="#redirectanchors">Redirecting Anchors</a></li><li><img alt="" src="../images/down.gif" /> Time-Dependent Rewriting</li><li><img alt="" src="../images/down.gif" /> Backward Compatibility for YYYY to XXXX migration</li><li><img alt="" src="../images/down.gif" /> <a href="#content">Content Handling</a></li><li><img alt="" src="../images/down.gif" /> <a href="#access">Access Restriction</a></li><li><img alt="" src="../images/down.gif" /> <a href="#other">Other</a></li></ul><h3>See also</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Moduledocumentation</a></li><li><a href="rewrite_intro.html">mod_rewriteintroduction</a></li><li><a href="rewrite_tech.html">Technical details</a></li></ul></div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="canonicalurl" id="canonicalurl">Canonical URLs</a></h2><dl> <dt>Description:</dt> <dd> <p>On some webservers there are more than one URL for a resource. Usually there are canonical URLs (which should be actually used and distributed) and those which are just shortcuts, internal ones, etc. Independent of which URL the user supplied with the request he should finally see the canonical one only.</p> </dd> <dt>Solution:</dt> <dd> <p>We do an external HTTP redirect for all non-canonical URLs to fix them in the location view of the Browser and for all subsequent requests. In the example ruleset below we replace <code>/~user</code> by the canonical <code>/u/user</code> and fix a missing trailing slash for <code>/u/user</code>.</p><div class="example"><pre>RewriteRule ^/<strong>~</strong>([^/]+)/?(.*) /<strong>u</strong>/$1/$2 [<strong>R</strong>]RewriteRule ^/([uge])/(<strong>[^/]+</strong>)$ /$1/$2<strong>/</strong> [<strong>R</strong>]</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="canonicalhost" id="canonicalhost">Canonical Hostnames</a></h2> <dl> <dt>Description:</dt> <dd>The goal of this rule is to force the use of a particular hostname, in preference to other hostnames which may be used to reach the same site. For example, if you wish to force the use of <strong>www.example.com</strong> instead of <strong>example.com</strong>, you might use a variant of the following recipe.</dd> <dt>Solution:</dt> <dd><p>For sites running on a port other than 80:</p><div class="example"><pre>RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]RewriteCond %{HTTP_HOST} !^$RewriteCond %{SERVER_PORT} !^80$RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]</pre></div><p>And for a site running on port 80</p><div class="example"><pre>RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]RewriteCond %{HTTP_HOST} !^$RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="moveddocroot" id="moveddocroot">Moved <code>DocumentRoot</code></a></h2> <dl> <dt>Description:</dt> <dd><p>Usually the <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>of the webserver directly relates to the URL "<code>/</code>".But often this data is not really of top-level priority. For example,you may wish for visitors, on first entering a site, to go to aparticular subdirectory <code>/about/</code>. This may be accomplishedusing the following ruleset:</p></dd> <dt>Solution:</dt> <dd> <p>We redirect the URL <code>/</code> to <code>/about/</code>: </p> <div class="example"><pre>RewriteEngine onRewriteRule <strong>^/$</strong> /about/ [<strong>R</strong>]</pre></div> <p>Note that this can also be handled using the <code class="directive"><a href="../mod/mod_alias.html#redirectmatch">RedirectMatch</a></code> directive:</p><div class="example"><p><code>RedirectMatch ^/$ http://example.com/e/www/</code></p></div></dd></dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="trailingslash" id="trailingslash">Trailing Slash Problem</a></h2> <dl> <dt>Description:</dt> <dd><p>The vast majority of "trailing slash" problems can be dealt with using the techniques discussed in the <a href="http://httpd.apache.org/docs/misc/FAQ-E.html#set-servername">FAQ entry</a>. However, occasionally, there is a need to use mod_rewrite to handle a case where a missing trailing slash causes a URL to fail. This can happen, for example, after a series of complex rewrite rules.</p> </dd> <dt>Solution:</dt> <dd> <p>The solution to this subtle problem is to let the server add the trailing slash automatically. To do this correctly we have to use an external redirect, so the browser correctly requests subsequent images etc. If we only did a internal rewrite, this would only work for the directory page, but would go wrong when any images are included into this page with relative URLs, because the browser would request an in-lined object. For instance, a request for <code>image.gif</code> in <code>/~quux/foo/index.html</code> would become <code>/~quux/image.gif</code> without the external redirect!</p> <p>So, to do this trick we write:</p><div class="example"><pre>RewriteEngine onRewriteBase /~quux/RewriteRule ^foo<strong>$</strong> foo<strong>/</strong> [<strong>R</strong>]</pre></div> <p>Alternately, you can put the following in a top-level <code>.htaccess</code> file in the content directory. But note that this creates some processing overhead.</p><div class="example"><pre>RewriteEngine onRewriteBase /~quux/RewriteCond %{REQUEST_FILENAME} <strong>-d</strong>RewriteRule ^(.+<strong>[^/]</strong>)$ $1<strong>/</strong> [R]</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="movehomedirs" id="movehomedirs">Move Homedirs to Different Webserver</a></h2> <dl> <dt>Description:</dt> <dd> <p>Many webmasters have asked for a solution to the following situation: They wanted to redirect just all homedirs on a webserver to another webserver. They usually need such things when establishing a newer webserver which will replace the old one over time.</p> </dd> <dt>Solution:</dt> <dd> <p>The solution is trivial with <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>. On the old webserver we just redirect all <code>/~user/anypath</code> URLs to <code>http://newserver/~user/anypath</code>.</p><div class="example"><pre>RewriteEngine onRewriteRule ^/~(.+) http://<strong>newserver</strong>/~$1 [R,L]</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="multipledirs" id="multipledirs">Search pages in more than one directory</a></h2> <dl> <dt>Description:</dt> <dd> <p>Sometimes it is necessary to let the webserver search for pages in more than one directory. Here MultiViews or other techniques cannot help.</p> </dd> <dt>Solution:</dt> <dd> <p>We program a explicit ruleset which searches for the files in the directories.</p><div class="example"><pre>RewriteEngine on# first try to find it in custom/...# ...and if found stop and be happy:RewriteCond /your/docroot/<strong>dir1</strong>/%{REQUEST_FILENAME} -fRewriteRule ^(.+) /your/docroot/<strong>dir1</strong>/$1 [L]# second try to find it in pub/...# ...and if found stop and be happy:RewriteCond /your/docroot/<strong>dir2</strong>/%{REQUEST_FILENAME} -fRewriteRule ^(.+) /your/docroot/<strong>dir2</strong>/$1 [L]# else go on for other Alias or ScriptAlias directives,# etc.RewriteRule ^(.+) - [PT]</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="setenvvars" id="setenvvars">Set Environment Variables According To URL Parts</a></h2> <dl> <dt>Description:</dt> <dd> <p>Perhaps you want to keep status information between requests and use the URL to encode it. But you don't want to use a CGI wrapper for all pages just to strip out this information.</p> </dd> <dt>Solution:</dt> <dd> <p>We use a rewrite rule to strip out the status information and remember it via an environment variable which can be later dereferenced from within XSSI or CGI. This way a URL <code>/foo/S=java/bar/</code> gets translated to <code>/foo/bar/</code> and the environment variable named <code>STATUS</code> is set to the value "java".</p><div class="example"><pre>RewriteEngine onRewriteRule ^(.*)/<strong>S=([^/]+)</strong>/(.*) $1/$3 [E=<strong>STATUS:$2</strong>]</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="uservhosts" id="uservhosts">Virtual User Hosts</a></h2> <dl> <dt>Description:</dt> <dd> <p>Assume that you want to provide <code>www.<strong>username</strong>.host.domain.com</code> for the homepage of username via just DNS A records to the same machine and without any virtualhosts on this machine.</p> </dd> <dt>Solution:</dt> <dd> <p>For HTTP/1.0 requests there is no solution, but for HTTP/1.1 requests which contain a Host: HTTP header we can use the following ruleset to rewrite <code>http://www.username.host.com/anypath</code> internally to <code>/home/username/anypath</code>:</p><div class="example"><pre>RewriteEngine onRewriteCond %{<strong>HTTP_HOST</strong>} ^www\.<strong>[^.]+</strong>\.host\.com$RewriteRule ^(.+) %{HTTP_HOST}$1 [C]RewriteRule ^www\.<strong>([^.]+)</strong>\.host\.com(.*) /home/<strong>$1</strong>$2</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="redirecthome" id="redirecthome">Redirect Homedirs For Foreigners</a></h2> <dl> <dt>Description:</dt> <dd> <p>We want to redirect homedir URLs to another webserver <code>www.somewhere.com</code> when the requesting user does not stay in the local domain <code>ourdomain.com</code>. This is sometimes used in virtual host contexts.</p> </dd> <dt>Solution:</dt> <dd> <p>Just a rewrite condition:</p><div class="example"><pre>RewriteEngine onRewriteCond %{REMOTE_HOST} <strong>!^.+\.ourdomain\.com$</strong>RewriteRule ^(/~.+) http://www.somewhere.com/$1 [R,L]</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -