⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_rewrite.html.en

📁 apache 安装教程 apache 安装教程
💻 EN
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--%hypertext --><!-- mod_rewrite.html                                 --><!-- Documentation for the mod_rewrite Apache module  --><html xmlns="http://www.w3.org/1999/xhtml">  <head>    <meta name="generator" content="HTML Tidy, see www.w3.org" />    <title>Apache module mod_rewrite</title>  </head>  <!-- Background white, links blue (unvisited), navy (visited), red (active) -->  <body bgcolor="#FFFFFF" text="#000000" link="#0000FF"  vlink="#000080" alink="#FF0000">    <blockquote>      <!-- page indentation -->          <div align="CENTER">      <img src="../images/sub.gif" alt="[APACHE DOCUMENTATION]" />      <h3>Apache HTTP Server Version 1.3</h3>        <p><small><em>Is this the version you want?  For more recent         versions, check our <a href="/docs/">documentation          index</a>.</em></small></p>    </div>      <br />             <h1 align="CENTER">Module mod_rewrite<br />       URL Rewriting Engine</h1>      <p>This module provides a rule-based rewriting engine to      rewrite requested URLs on the fly.</p>      <p><a href="module-dict.html#Status"      rel="Help"><strong>Status:</strong></a> Extension<br />       <a href="module-dict.html#SourceFile"      rel="Help"><strong>Source File:</strong></a>      mod_rewrite.c<br />       <a href="module-dict.html#ModuleIdentifier"      rel="Help"><strong>Module Identifier:</strong></a>      rewrite_module<br />       <a href="module-dict.html#Compatibility"      rel="Help"><strong>Compatibility:</strong></a> Available in      Apache 1.2 and later.</p>      <hr noshade="noshade" size="1" />      <br />             <h2>Summary</h2>      <blockquote>        <blockquote>          <blockquote>            <em>``The great thing about mod_rewrite is it gives you            all the configurability and flexibility of Sendmail.            The downside to mod_rewrite is that it gives you all            the configurability and flexibility of Sendmail.''</em>                        <div align="RIGHT">              -- Brian Behlendorf<br />               Apache Group            </div>          </blockquote>        </blockquote>      </blockquote>      <blockquote>        <blockquote>          <blockquote>            <em>`` Despite the tons of examples and docs,            mod_rewrite is voodoo. Damned cool voodoo, but still            voodoo. ''</em>             <div align="RIGHT">              -- Brian Moore<br />               bem@news.cmc.net            </div>          </blockquote>        </blockquote>      </blockquote>      Welcome to mod_rewrite, the Swiss Army Knife of URL      manipulation!       <p>This module uses a rule-based rewriting engine (based on a      regular-expression parser) to rewrite requested URLs on the      fly. It supports an unlimited number of rules and an      unlimited number of attached rule conditions for each rule to      provide a really flexible and powerful URL manipulation      mechanism. The URL manipulations can depend on various tests,      for instance server variables, environment variables, HTTP      headers, time stamps and even external database lookups in      various formats can be used to achieve a really granular URL      matching.</p>      <p>This module operates on the full URLs (including the      path-info part) both in per-server context      (<code>httpd.conf</code>) and per-directory context      (<code>.htaccess</code>) and can even generate query-string      parts on result. The rewritten result can lead to internal      sub-processing, external request redirection or even to an      internal proxy throughput.</p>      <p>But all this functionality and flexibility has its      drawback: complexity. So don't expect to understand this      entire module in just one day.</p>      <p>This module was invented and originally written in April      1996<br />       and gifted exclusively to the The Apache Group in July 1997      by</p>      <blockquote>        <a href="http://www.engelschall.com/"><code>Ralf S.        Engelschall</code></a><br />         <a        href="mailto:rse@engelschall.com"><code>rse@engelschall.com</code></a><br />         <a        href="http://www.engelschall.com/"><code>www.engelschall.com</code></a>      </blockquote>      <hr noshade="noshade" size="1" />      <h2>Table Of Contents</h2>      <p><strong>Internal Processing</strong></p>      <ul>        <li><a href="#InternalAPI">API Phases</a></li>        <li><a href="#InternalRuleset">Ruleset Processing</a></li>        <li><a href="#InternalBackRefs">Regex Back-Reference        Availability</a></li>      </ul>      <p><strong>Configuration Directives</strong></p>      <ul>        <li><a href="#RewriteEngine">RewriteEngine</a></li>        <li><a href="#RewriteOptions">RewriteOptions</a></li>        <li><a href="#RewriteLog">RewriteLog</a></li>        <li><a href="#RewriteLogLevel">RewriteLogLevel</a></li>        <li><a href="#RewriteLock">RewriteLock</a></li>        <li><a href="#RewriteMap">RewriteMap</a></li>        <li><a href="#RewriteBase">RewriteBase</a></li>        <li><a href="#RewriteCond">RewriteCond</a></li>        <li><a href="#RewriteRule">RewriteRule</a></li>      </ul>      <strong>Miscellaneous</strong>       <ul>        <li><a href="#EnvVar">Environment Variables</a></li>        <li><a href="#Solutions">Practical Solutions</a></li>      </ul>      <hr noshade="noshade" size="1" />      <center>        <h1><a id="Internal" name="Internal">Internal        Processing</a></h1>      </center>      <hr noshade="noshade" size="1" />      <p>The internal processing of this module is very complex but      needs to be explained once even to the average user to avoid      common mistakes and to let you exploit its full      functionality.</p>      <h2><a id="InternalAPI" name="InternalAPI">API      Phases</a></h2>      <p>First you have to understand that when Apache processes a      HTTP request it does this in phases. A hook for each of these      phases is provided by the Apache API. Mod_rewrite uses two of      these hooks: the URL-to-filename translation hook which is      used after the HTTP request has been read but before any      authorization starts and the Fixup hook which is triggered      after the authorization phases and after the per-directory      config files (<code>.htaccess</code>) have been read, but      before the content handler is activated.</p>      <p>So, after a request comes in and Apache has determined the      corresponding server (or virtual server) the rewriting engine      starts processing of all mod_rewrite directives from the      per-server configuration in the URL-to-filename phase. A few      steps later when the final data directories are found, the      per-directory configuration directives of mod_rewrite are      triggered in the Fixup phase. In both situations mod_rewrite      rewrites URLs either to new URLs or to filenames, although      there is no obvious distinction between them. This is a usage      of the API which was not intended to be this way when the API      was designed, but as of Apache 1.x this is the only way      mod_rewrite can operate. To make this point more clear      remember the following two points:</p>      <ol>        <li>Although mod_rewrite rewrites URLs to URLs, URLs to        filenames and even filenames to filenames, the API        currently provides only a URL-to-filename hook. In Apache        2.0 the two missing hooks will be added to make the        processing more clear. But this point has no drawbacks for        the user, it is just a fact which should be remembered:        Apache does more in the URL-to-filename hook than the API        intends for it.</li>        <li>          Unbelievably mod_rewrite provides URL manipulations in          per-directory context, <em>i.e.</em>, within          <code>.htaccess</code> files, although these are reached          a very long time after the URLs have been translated to          filenames. It has to be this way because          <code>.htaccess</code> files live in the filesystem, so          processing has already reached this stage. In other          words: According to the API phases at this time it is too          late for any URL manipulations. To overcome this chicken          and egg problem mod_rewrite uses a trick: When you          manipulate a URL/filename in per-directory context          mod_rewrite first rewrites the filename back to its          corresponding URL (which is usually impossible, but see          the <code>RewriteBase</code> directive below for the          trick to achieve this) and then initiates a new internal          sub-request with the new URL. This restarts processing of          the API phases.           <p>Again mod_rewrite tries hard to make this complicated          step totally transparent to the user, but you should          remember here: While URL manipulations in per-server          context are really fast and efficient, per-directory          rewrites are slow and inefficient due to this chicken and          egg problem. But on the other hand this is the only way          mod_rewrite can provide (locally restricted) URL          manipulations to the average user.</p>        </li>      </ol>      <p>Don't forget these two points!</p>      <h2><a id="InternalRuleset" name="InternalRuleset">Ruleset      Processing</a></h2>      Now when mod_rewrite is triggered in these two API phases, it      reads the configured rulesets from its configuration      structure (which itself was either created on startup for      per-server context or during the directory walk of the Apache      kernel for per-directory context). Then the URL rewriting      engine is started with the contained ruleset (one or more      rules together with their conditions). The operation of the      URL rewriting engine itself is exactly the same for both      configuration contexts. Only the final result processing is      different.       <p>The order of rules in the ruleset is important because the      rewriting engine processes them in a special (and not very      obvious) order. The rule is this: The rewriting engine loops      through the ruleset rule by rule (<code>RewriteRule</code>      directives) and when a particular rule matches it optionally      loops through existing corresponding conditions      (<code>RewriteCond</code> directives). For historical reasons      the conditions are given first, and so the control flow is a      little bit long-winded. See Figure 1 for more details.</p>      <div align="CENTER">        <table cellspacing="0" cellpadding="2" border="0">          <tr>            <td bgcolor="#CCCCCC"><img            src="../images/mod_rewrite_fig1.gif" width="428"            height="385"            alt="[Needs graphics capability to display]" /></td>          </tr>          <tr>            <td align="CENTER"><strong>Figure 1:</strong> The            control flow through the rewriting ruleset</td>          </tr>        </table>      </div>      <p>As you can see, first the URL is matched against the      <em>Pattern</em> of each rule. When it fails mod_rewrite      immediately stops processing this rule and continues with the      next rule. If the <em>Pattern</em> matches, mod_rewrite looks      for corresponding rule conditions. If none are present, it      just substitutes the URL with a new value which is      constructed from the string <em>Substitution</em> and goes on      with its rule-looping. But if conditions exist, it starts an      inner loop for processing them in the order that they are      listed. For conditions the logic is different: we don't match      a pattern against the current URL. Instead we first create a      string <em>TestString</em> by expanding variables,      back-references, map lookups, <em>etc.</em> and then we try      to match <em>CondPattern</em> against it. If the pattern      doesn't match, the complete set of conditions and the      corresponding rule fails. If the pattern matches, then the      next condition is processed until no more conditions are      available. If all conditions match, processing is continued      with the substitution of the URL with      <em>Substitution</em>.</p>      <h2><a id="quoting" name="quoting">Quoting Special      Characters</a></h2>      <p>As of Apache 1.3.20, special characters in      <i>TestString</i> and <i>Substitution</i> strings can be      escaped (that is, treated as normal characters without their      usual special meaning) by prefixing them with a slosh ('\')      character. In other words, you can include an actual      dollar-sign character in a <i>Substitution</i> string by      using '<code>\$</code>'; this keeps mod_rewrite from trying      to treat it as a backreference.</p>      <h2><a id="InternalBackRefs" name="InternalBackRefs">Regex      Back-Reference Availability</a></h2>      One important thing here has to be remembered: Whenever you      use parentheses in <em>Pattern</em> or in one of the      <em>CondPattern</em>, back-references are internally created      which can be used with the strings <code>$N</code> and      <code>%N</code> (see below). These are available for creating

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -