📄 mod_rewrite.html
字号:
script matching the request.</dd>
<dt><code>HTTPS</code></dt>
<dd>Will contain the text "on" if the connection is
using SSL/TLS, or "off" otherwise. (This variable
can be safely used regardless of whether
<code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code> is loaded).</dd>
</dl>
</div>
</li>
</ul>
<p>Special Notes:</p>
<ol>
<li>The variables SCRIPT_FILENAME and REQUEST_FILENAME
contain the same value, <em>i.e.</em>, the value of the
<code>filename</code> field of the internal
<code>request_rec</code> structure of the Apache server.
The first name is just the commonly known CGI variable name
while the second is the consistent counterpart to
REQUEST_URI (which contains the value of the
<code>uri</code> field of <code>request_rec</code>).</li>
<li>There is the special format:
<code>%{ENV:variable}</code> where <em>variable</em> can be
any environment variable. This is looked-up via internal
Apache structures and (if not found there) via
<code>getenv()</code> from the Apache server process.</li>
<li>There is the special format:
<code>%{SSL:variable}</code> where <em>variable</em> is the
name of an <a href="mod_ssl.html#envvars">SSL environment
variable</a>; this can be used whether or not
<code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code> is loaded, but will always expand to
the empty string if it is not. Example:
<code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to
<code>128</code>.</li>
<li>There is the special format:
<code>%{HTTP:header}</code> where <em>header</em> can be
any HTTP MIME-header name. This is looked-up from the HTTP
request. Example: <code>%{HTTP:Proxy-Connection}</code> is
the value of the HTTP header
"<code>Proxy-Connection:</code>".</li>
<li>There is the special format
<code>%{LA-U:variable}</code> for look-aheads which perform
an internal (URL-based) sub-request to determine the final
value of <em>variable</em>. Use this when you want to use a
variable for rewriting which is actually set later in an
API phase and thus is not available at the current stage.
For instance when you want to rewrite according to the
<code>REMOTE_USER</code> variable from within the
per-server context (<code>httpd.conf</code> file) you have
to use <code>%{LA-U:REMOTE_USER}</code> because this
variable is set by the authorization phases which come
<em>after</em> the URL translation phase where mod_rewrite
operates. On the other hand, because mod_rewrite implements
its per-directory context (<code>.htaccess</code> file) via
the Fixup phase of the API and because the authorization
phases come <em>before</em> this phase, you just can use
<code>%{REMOTE_USER}</code> there.</li>
<li>There is the special format:
<code>%{LA-F:variable}</code> which performs an internal
(filename-based) sub-request to determine the final value
of <em>variable</em>. Most of the time this is the same as
LA-U above.</li>
</ol>
<p><em>CondPattern</em> is the condition pattern,
<em>i.e.</em>, a regular expression which is applied to the
current instance of the <em>TestString</em>, <em>i.e.</em>, <em>TestString</em> is evaluated and then matched against
<em>CondPattern</em>.</p>
<p><strong>Remember:</strong> <em>CondPattern</em> is a
<em>perl compatible regular expression</em> with some
additions:</p>
<ol>
<li>You can prefix the pattern string with a
'<code>!</code>' character (exclamation mark) to specify a
<strong>non</strong>-matching pattern.</li>
<li>
There are some special variants of <em>CondPatterns</em>.
Instead of real regular expression strings you can also
use one of the following:
<ul>
<li>'<strong><CondPattern</strong>' (is lexically
lower)<br />
Treats the <em>CondPattern</em> as a plain string and
compares it lexically to <em>TestString</em>. True if
<em>TestString</em> is lexically lower than
<em>CondPattern</em>.</li>
<li>'<strong>>CondPattern</strong>' (is lexically
greater)<br />
Treats the <em>CondPattern</em> as a plain string and
compares it lexically to <em>TestString</em>. True if
<em>TestString</em> is lexically greater than
<em>CondPattern</em>.</li>
<li>'<strong>=CondPattern</strong>' (is lexically
equal)<br />
Treats the <em>CondPattern</em> as a plain string and
compares it lexically to <em>TestString</em>. True if
<em>TestString</em> is lexically equal to
<em>CondPattern</em>, i.e the two strings are exactly
equal (character by character). If <em>CondPattern</em>
is just <code>""</code> (two quotation marks) this
compares <em>TestString</em> to the empty string.</li>
<li>'<strong>-d</strong>' (is
<strong>d</strong>irectory)<br />
Treats the <em>TestString</em> as a pathname and tests
if it exists and is a directory.</li>
<li>'<strong>-f</strong>' (is regular
<strong>f</strong>ile)<br />
Treats the <em>TestString</em> as a pathname and tests
if it exists and is a regular file.</li>
<li>'<strong>-s</strong>' (is regular file with
<strong>s</strong>ize)<br />
Treats the <em>TestString</em> as a pathname and tests
if it exists and is a regular file with size greater
than zero.</li>
<li>'<strong>-l</strong>' (is symbolic
<strong>l</strong>ink)<br />
Treats the <em>TestString</em> as a pathname and tests
if it exists and is a symbolic link.</li>
<li>'<strong>-x</strong>' (has e<strong>x</strong>ecutable
permissions)<br />
Treats the <em>TestString</em> as a pathname and tests
if it exists and has execution permissions. These permissions
are determined depending on the underlying OS.</li>
<li>'<strong>-F</strong>' (is existing file via
subrequest)<br />
Checks if <em>TestString</em> is a valid file and
accessible via all the server's currently-configured
access controls for that path. This uses an internal
subrequest to determine the check, so use it with care
because it decreases your servers performance!</li>
<li>'<strong>-U</strong>' (is existing URL via
subrequest)<br />
Checks if <em>TestString</em> is a valid URL and
accessible via all the server's currently-configured
access controls for that path. This uses an internal
subrequest to determine the check, so use it with care
because it decreases your server's performance!</li>
</ul>
<div class="note"><h3>Notice</h3>
All of these tests can
also be prefixed by an exclamation mark ('!') to
negate their meaning.
</div>
</li>
</ol>
<p>Additionally you can set special flags for
<em>CondPattern</em> by appending</p>
<p class="indent">
<strong><code>[</code><em>flags</em><code>]</code></strong>
</p>
<p>as the third argument to the <code>RewriteCond</code>
directive. <em>Flags</em> is a comma-separated list of the
following flags:</p>
<ul>
<li>'<strong><code>nocase|NC</code></strong>'
(<strong>n</strong>o <strong>c</strong>ase)<br />
This makes the test case-insensitive, <em>i.e.</em>, there
is no difference between 'A-Z' and 'a-z' both in the
expanded <em>TestString</em> and the <em>CondPattern</em>.
This flag is effective only for comparisons between
<em>TestString</em>和<em>CondPattern</em>. It has no
effect on filesystem and subrequest checks.</li>
<li>
'<strong><code>ornext|OR</code></strong>'
(<strong>或</strong> next condition)<br />
Use this to combine rule conditions with a local OR
instead of the implicit AND. Typical example:
<div class="example"><pre>
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule ...some special stuff for any of these hosts...
</pre></div>
Without this flag you would have to write the cond/rule
three times.
</li>
</ul>
<p><strong>Example:</strong></p>
<p>To rewrite the Homepage of a site according to the
"<code>User-Agent:</code>" header of the request, you can
use the following: </p>
<div class="example"><pre>
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /homepage.max.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$ /homepage.min.html [L]
RewriteRule ^/$ /homepage.std.html [L]
</pre></div>
<p>Interpretation: If you use Netscape Navigator as your
browser (which identifies itself as 'Mozilla'), then you
get the max homepage, which includes Frames, <em>etc.</em>
If you use the Lynx browser (which is Terminal-based), then
you get the min homepage, which contains no images, no
tables, <em>etc.</em> If you use any other browser you get
the standard homepage.</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="RewriteEngine" id="RewriteEngine">RewriteEngine</a> <a name="rewriteengine" id="rewriteengine">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>Enables or disables runtime rewriting engine</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>RewriteEngine on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>RewriteEngine off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">覆盖项</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>扩展(E)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_rewrite</td></tr>
</table>
<p><code class="directive">RewriteEngine</code> directive enables or
disables the runtime rewriting engine. If it is set to
<code>off</code> this module does no runtime processing at
all. It does not even update the <code>SCRIPT_URx</code>
environment variables.</p>
<p>Use this directive to disable the module instead of
commenting out all the <code class="directive"><a href="#rewriterule">RewriteRule</a></code> directives!</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -