blob: 3369ec9c3dc15bd9603aa6c1b2c55080c6c4701e [file] [log] [blame]
<!--#if expr="$FAQMASTER" -->
<!--#set var="STANDALONE" value="" -->
<!--#set var="INCLUDED" value="YES" -->
<!--#if expr="$QUERY_STRING = TOC" -->
<!--#set var="TOC" value="YES" -->
<!--#set var="CONTENT" value="" -->
<!--#else -->
<!--#set var="TOC" value="" -->
<!--#set var="CONTENT" value="YES" -->
<!--#endif -->
<!--#else -->
<!--#set var="STANDALONE" value="YES" -->
<!--#set var="INCLUDED" value="" -->
<!--#set var="TOC" value="" -->
<!--#set var="CONTENT" value="" -->
<!--#endif -->
<!--#if expr="$STANDALONE" -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Apache Server Frequently Asked Questions</TITLE>
</HEAD>
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
<BODY
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#000080"
ALINK="#FF0000"
>
<!--#include virtual="header.html" -->
<H1 ALIGN="CENTER">Apache Server Frequently Asked Questions</H1>
<P>
$Revision: 1.1 $ ($Date: 1999/06/24 15:02:52 $)
</P>
<P>
The latest version of this FAQ is always available from the main
Apache web site, at
&lt;<A
HREF="http://www.apache.org/docs/misc/FAQ.html"
REL="Help"
><SAMP>http://www.apache.org/docs/misc/FAQ.html</SAMP></A>&gt;.
</P>
<!-- Notes about changes: -->
<!-- - If adding a relative link to another part of the -->
<!-- documentation, *do* include the ".html" portion. There's a -->
<!-- good chance that the user will be reading the documentation -->
<!-- on his own system, which may not be configured for -->
<!-- multiviews. -->
<!-- - When adding items, make sure they're put in the right place -->
<!-- - verify that the numbering matches up. -->
<!-- - *Don't* use <PRE></PRE> blocks - they don't appear -->
<!-- correctly in a reliable way when this is converted to text -->
<!-- with Lynx. Use <DL><DD><CODE>xxx<BR>xx</CODE></DD></DL> -->
<!-- blocks inside a <P></P> instead. This is necessary to get -->
<!-- the horizontal and vertical indenting right. -->
<!-- - Don't forget to include an HR tag after the last /P tag -->
<!-- but before the /LI in an item. -->
<P>
If you are reading a text-only version of this FAQ, you may find numbers
enclosed in brackets (such as &quot;[12]&quot;). These refer to the list of
reference URLs to be found at the end of the document. These references
do not appear, and are not needed, for the hypertext version.
</P>
<H2>The Questions</H2>
<OL TYPE="A">
<!--#endif -->
<!--#if expr="$TOC || $STANDALONE" -->
<LI VALUE="8"><STRONG>URL Rewriting</STRONG>
<OL>
<LI><A HREF="#rewrite-more-config">Where can I find mod_rewrite rulesets
which already solve particular URL-related problems?</A>
</LI>
<LI><A HREF="#rewrite-article">Where can I find any published information
about URL-manipulations and mod_rewrite?</A>
</LI>
<LI><A HREF="#rewrite-complexity">Why is mod_rewrite so difficult to learn
and seems so complicated?</A>
</LI>
<LI><A HREF="#rewrite-dontwork">What can I do if my RewriteRules don't work
as expected?</A>
</LI>
<LI><A HREF="#rewrite-prefixdocroot">Why don't some of my URLs get
prefixed with DocumentRoot when using mod_rewrite?</A>
</LI>
<LI><A HREF="#rewrite-nocase">How can I make all my URLs case-insensitive
with mod_rewrite?</A>
</LI>
<LI><A HREF="#rewrite-virthost">Why are RewriteRules in my VirtualHost
parts ignored?</A>
</LI>
<LI><A HREF="#rewrite-envwhitespace">How can I use strings with whitespaces
in RewriteRule's ENV flag?</A>
</LI>
</OL>
</LI>
<!--#endif -->
<!--#if expr="$STANDALONE" -->
</OL>
<HR>
<H2>The Answers</H2>
<!--#endif -->
<!--#if expr="! $TOC" -->
<H3>H. URL Rewriting</H3>
<OL>
<LI><A NAME="rewrite-more-config">
<STRONG>Where can I find mod_rewrite rulesets which already solve
particular URL-related problems?</STRONG>
</A>
<P>
There is a collection of
<A HREF="http://www.engelschall.com/pw/apache/rewriteguide/"
>Practical Solutions for URL-Manipulation</A>
where you can
find all typical solutions the author of
<A HREF="../mod/mod_rewrite.html"><SAMP>mod_rewrite</SAMP></A>
currently knows of. If you have more
interesting rulesets which solve particular problems not currently covered in
this document, send it to
<A HREF="mailto:rse@apache.org">Ralf S. Engelschall</A>
for inclusion. The
other webmasters will thank you for avoiding the reinvention of the wheel.
</P>
<HR>
</LI>
<LI><A NAME="rewrite-article">
<STRONG>Where can I find any published information about
URL-manipulations and mod_rewrite?</STRONG>
</A>
<P>
There is an article from
<A HREF="mailto:rse@apache.org"
>Ralf S. Engelschall</A>
about URL-manipulations based on
<A HREF="../mod/mod_rewrite.html"><SAMP>mod_rewrite</SAMP></A>
in the &quot;iX Multiuser Multitasking Magazin&quot; issue #12/96. The
german (original) version
can be read online at
&lt;<A HREF="http://www.heise.de/ix/artikel/9612149/"
>http://www.heise.de/ix/artikel/9612149/</A>&gt;,
the English (translated) version can be found at
&lt;<A HREF="http://www.heise.de/ix/artikel/E/9612149/"
>http://www.heise.de/ix/artikel/E/9612149/</A>&gt;.
</P>
<HR>
</LI>
<LI><A NAME="rewrite-complexity">
<STRONG>Why is mod_rewrite so difficult to learn and seems so
complicated?</STRONG>
</A>
<P>
Hmmm... there are a lot of reasons. First, mod_rewrite itself is a powerful
module which can help you in really <STRONG>all</STRONG> aspects of URL
rewriting, so it can be no trivial module per definition. To accomplish
its hard job it uses software leverage and makes use of a powerful regular
expression
library by Henry Spencer which is an integral part of Apache since its
version 1.2. And regular expressions itself can be difficult to newbies,
while providing the most flexible power to the advanced hacker.
</P>
<P>
On the other hand mod_rewrite has to work inside the Apache API environment
and needs to do some tricks to fit there. For instance the Apache API as of
1.x really was not designed for URL rewriting at the <TT>.htaccess</TT>
level of processing. Or the problem of multiple rewrites in sequence, which
is also not handled by the API per design. To provide this features
mod_rewrite has to do some special (but API compliant!) handling which leads
to difficult processing inside the Apache kernel. While the user usually
doesn't see anything of this processing, it can be difficult to find
problems when some of your RewriteRules seem not to work.
</P>
<HR>
</LI>
<LI><A NAME="rewrite-dontwork">
<STRONG>What can I do if my RewriteRules don't work as expected?
</STRONG>
</A>
<P>
Use &quot;<SAMP>RewriteLog somefile</SAMP>&quot; and
&quot;<SAMP>RewriteLogLevel 9</SAMP>&quot; and have a precise look at the
steps the rewriting engine performs. This is really the only one and best
way to debug your rewriting configuration.
</P>
<HR>
</LI>
<LI><A NAME="rewrite-prefixdocroot"><STRONG>Why don't some of my URLs
get prefixed with DocumentRoot when using mod_rewrite?</STRONG>
</A>
<P>
If the rule starts with <SAMP>/somedir/...</SAMP> make sure that
really no <SAMP>/somedir</SAMP> exists on the filesystem if you
don't want to lead the URL to match this directory, <EM>i.e.</EM>,
there must be no root directory named <SAMP>somedir</SAMP> on the
filesystem. Because if there is such a directory, the URL will not
get prefixed with DocumentRoot. This behaviour looks ugly, but is
really important for some other aspects of URL rewriting.
</P>
<HR>
</LI>
<LI><A NAME="rewrite-nocase">
<STRONG>How can I make all my URLs case-insensitive with mod_rewrite?
</STRONG>
</A>
<P>
You can't! The reason is: First, case translations for arbitrary
length URLs cannot be done <EM>via</EM> regex patterns and
corresponding substitutions. One need a per-character pattern like
sed/Perl <SAMP>tr|..|..|</SAMP> feature. Second, just making URLs
always upper or lower case will not resolve the complete problem of
case-INSENSITIVE URLs, because actually the URLs had to be rewritten
to the correct case-variant residing on the filesystem because in
later processing Apache needs to access the file. And Unix
filesystem is always case-SENSITIVE.
</P>
<P>
But there is a module named <CODE>mod_speling.c</CODE> (yes, it is named
this way!) out there on the net. Try this one.
</P>
<HR>
</LI>
<LI><A NAME="rewrite-virthost">
<STRONG> Why are RewriteRules in my VirtualHost parts ignored?</STRONG>
</A>
<P>
Because you have to enable the engine for every virtual host explicitly due
to security concerns. Just add a &quot;RewriteEngine on&quot; to your
virtual host configuration parts.
</P>
<HR>
</LI>
<LI><A NAME="rewrite-envwhitespace">
<STRONG> How can I use strings with whitespaces in RewriteRule's ENV
flag?</STRONG>
</A>
<P>
There is only one ugly solution: You have to surround the complete
flag argument by quotation marks (<SAMP>"[E=...]"</SAMP>). Notice:
The argument to quote here is not the argument to the E-flag, it is
the argument of the Apache config file parser, <EM>i.e.</EM>, the
third argument of the RewriteRule here. So you have to write
<SAMP>"[E=any text with whitespaces]"</SAMP>.
</P>
<HR>
</LI>
</OL>
<!--#endif -->
<!--#if expr="$STANDALONE" -->
<!-- Don't forget to add HR tags at the end of each list item.. -->
<!--#include virtual="footer.html" -->
</BODY>
</HTML>
<!--#endif -->