Commit 6da45d05 authored by Eric Covener's avatar Eric Covener
Browse files

synch up with trunk for the first half of RewriteRule:

PR#44838: be more up front with how the per-dir RewriteRule comparison is
the filesystem path minus the Directory the rules were listed in.



git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@1055672 13f79535-47bb-0310-9956-ffa450edef68
parent 0f757b3c
Loading
Loading
Loading
Loading
+53 −43
Changes for docs/manual/mod/mod_rewrite.xml: 53 added lines, 43 removed lines.
Original line number Diff line number Diff line
@@ -1120,23 +1120,70 @@ RewriteRule ^/$ /homepage.std.html [L]

      <p><a id="patterns" name="patterns"><em>Pattern</em></a> is
      a perl compatible <a id="regexp" name="regexp">regular
      expression</a>. On the first RewriteRule it is applied to the
      expression</a>. On the first RewriteRule it is applied to the (%-encoded)
      <a href="./directive-dict.html#Syntax">URL-path</a> of the request;
      subsequent patterns are applied to the output of the last matched
      RewriteRule.</p>

<note><title>What is matched?</title>
      <p>The <em>Pattern</em> will initially be matched against the part of the
      URL after the hostname and port, and before the query string. If you wish
      to match against the hostname, port, or query string, use a
      <p>In <directive module="core">VirtualHost</directive> context, 
      The <em>Pattern</em> will initially be matched against the part of the
      URL after the hostname and port, and before the query string (e.g. "/app1/index.html").</p>

      <p>In <directive module="core">Directory</directive> and htaccess context,
      the <em>Pattern</em> will initially be matched against the  
      <em>filesystem</em> path, after removing the prefix that lead the server
      to the current <directive>RewriteRule</directive> (e.g. "app1/index.html" 
      or "index.html" depending on where the directives are defined).</p>
       
      <p>If you wish to match against the hostname, port, or query string, use a
      <directive module="mod_rewrite">RewriteCond</directive> with the
      <code>%{HTTP_HOST}</code>, <code>%{SERVER_PORT}</code>, or
      <code>%{QUERY_STRING}</code> variables respectively.</p>

</note>

<note><title>Per-directory Rewrites</title>
<ul>
<li>The rewrite engine may be used in <a
href="../howto/htaccess.html">.htaccess</a> files in <directive type="section"
module="core">Directory</directive> sections, with some additional
complexity.</li>

<li>To enable the rewrite engine in this context, you need to set
"<code>RewriteEngine On</code>" <strong>and</strong>
"<code>Options FollowSymLinks</code>" must be enabled. If your
administrator has disabled override of <code>FollowSymLinks</code> for
a user's directory, then you cannot use the rewrite engine. This
restriction is required for security reasons.</li>

<li>When using the rewrite engine in <code>.htaccess</code> files the
per-directory prefix (which always is the same for a specific
directory) is automatically <em>removed</em> for the RewriteRule pattern matching
and automatically <em>added</em> after any relative (not starting with a
slash or protocol name) substitution encounters the end of a rule set.  
See the <directive module="mod_rewrite">RewriteBase</directive> 
directive for more information regarding what prefix will be added back to 
relative substutions.</li>

<li> If you wish to match against the full URL-path in a per-directory 
(htaccess) RewriteRule, use the <code>%{REQUEST_URI}</code> variable in
a <directive>RewriteCond</directive>.</li>

<li>The removed prefix always ends with a slash, meaning the matching occurs against a string which
<em>never</em> has a leading slash.  Therefore, A <em>Pattern</em> with <code>^/</code> never
matches in per-directory context.</li>

<li>Although rewrite rules are syntactically permitted in <directive
type="section" module="core">Location</directive> and <directive
type="section" module="core">Files</directive> sections, this
should never be necessary and is unsupported.</li>
</ul>
</note>

      <p>For some hints on <glossary ref="regex">regular
      expressions</glossary>, see
      the <a href="../rewrite/rewrite_intro.html#regex">mod_rewrite
      the <a href="../rewrite/intro.html#regex">mod_rewrite
      Introduction</a>.</p>

      <p>In mod_rewrite, the NOT character
@@ -1147,6 +1194,7 @@ RewriteRule ^/$ /homepage.std.html [L]
      it is easier to match the negative pattern, or as a last
      default rule.</p>


<note><title>Note</title>
When using the NOT character to negate a pattern, you cannot include 
grouped wildcard parts in that pattern. This is because, when the 
@@ -1570,44 +1618,6 @@ of <module>mod_userdir</module>.</p>
<p> This expansion does not occur when the <em>PT</em>
flag is used on the <directive module="mod_rewrite">RewriteRule</directive>
directive.</p>
</note>

<note><title>Per-directory Rewrites</title>
 
<p>The rewrite engine may be used in <a
href="../howto/htaccess.html">.htaccess</a> files.  To enable the
rewrite engine for these files you need to set
"<code>RewriteEngine On</code>" <strong>and</strong>
"<code>Options FollowSymLinks</code>" must be enabled. If your
administrator has disabled override of <code>FollowSymLinks</code> for
a user's directory, then you cannot use the rewrite engine. This
restriction is required for security reasons.</p>

<p>When using the rewrite engine in <code>.htaccess</code> files the
per-directory prefix (which always is the same for a specific
directory) is automatically <em>removed</em> for the pattern matching
and automatically <em>added</em> after the substitution has been
done. This feature is essential for many sorts of rewriting; without
this, you would always have to match the parent directory, which is
not always possible.  There is one exception: If a substitution string
starts with <code>http://</code>, then the directory prefix will
<strong>not</strong> be added, and an external redirect (or proxy
throughput, if using flag <strong>P</strong>) is forced.  See the
<directive module="mod_rewrite">RewriteBase</directive> directive for
more information.</p>

<p>The rewrite engine may also be used in <directive type="section"
module="core">Directory</directive> sections with the same
prefix-matching rules as would be applied to <code>.htaccess</code>
files.  It is usually simpler, however, to avoid the prefix substitution
complication by putting the rewrite rules in the main server or
virtual host context, rather than in a <directive type="section"
module="core">Directory</directive> section.</p>

<p>Although rewrite rules are syntactically permitted in <directive
type="section" module="core">Location</directive> sections, this
should never be necessary and is unsupported.</p>

</note>

     <p>Here are all possible substitution combinations and their