1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
<!--#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
<<A
HREF="http://www.apache.org/docs/misc/FAQ.html"
REL="Help"
><SAMP>http://www.apache.org/docs/misc/FAQ.html</SAMP></A>>.
</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 "[12]"). 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 "iX Multiuser Multitasking Magazin" issue #12/96. The
german (original) version
can be read online at
<<A HREF="http://www.heise.de/ix/artikel/9612149/"
>http://www.heise.de/ix/artikel/9612149/</A>>,
the English (translated) version can be found at
<<A HREF="http://www.heise.de/ix/artikel/E/9612149/"
>http://www.heise.de/ix/artikel/E/9612149/</A>>.
</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 "<SAMP>RewriteLog somefile</SAMP>" and
"<SAMP>RewriteLogLevel 9</SAMP>" 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 "RewriteEngine on" 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 -->
|