Die RewriteRule besteht aus zwei Teilen. Zum einen einem "Pattern" (Muster),
das die URLs
begrenzt, die umgeschrieben werden sollen und zum anderen die Transformation, die auf diese
URL durchgeführt werden soll:
RewriteRule PATTERN SUBSTITUTION [FLAGS]
Als Grundlage für das PATTERN (und auch die Substitution) dient die Syntax, die auch
bei den
Regexp von Perl Eingang gehalten hat. Ein Kurzüberblick:
Symbol
|
Beschreibung
|
.
|
ein einzelnes Zeichen
|
[chars]
|
die Menge der Zeichen "chars"
|
[^chars]
|
keines der Zeichen chars
|
text1|text2
|
Alternative: text1 oder text2
|
?
|
0 oder 1mal das Vorhergehende
|
*
|
0 oder n-mal das Vorhergehende
|
+
|
1 oder n-mal das Vorhergehende
|
()
|
Gruppierung von Text (kann als "backreference"
dienen - $1 = erste Klammer usw.)
|
^
|
Ausrichtung am Anfang der Zeile
|
$
|
Ende der Zeile
|
\char
|
"Escaping" von Sonderzeichen (z.B. .[]()...)
|
Zusätzlich unterstützt das mod_rewrite das "!" als "nicht" - sprich
Regeln können logisch
umgekehrt werden.
Backreferences erlaube es, Ausdrücke, die in Klammern stehen, an späterer Stelle wieder
zu
referenzieren und einzufügen. Dabei sind $N (N=0..9) Referenzen auf RewriteRule und %N
Referenzen auf RewriteCond- Ausdrücke. Servervariablen können mit %{VARNAME}
angesprochen werden, Einträge in Hashes (Maps, DB usw.) mit ${mapname:KEY|default} und
Umgebungsvariablen mit %{ENV:VAR}
Soll nur eine Regel definiert werden, aber (noch) kein Rewrite durchgeführt werden,
kann für die
Substitution auch ein "-" stehen.
Optional kann man nach der Substition auch noch zusätzliche Flags in eckigen Klammern
als
drittes Argument angeben. Die Flags werden per Kommata getrennt.
Flag
|
Beschreibung
|
Beispiel
|
redirect|R [=code]
|
Erzwinge einen Redirect. Es wird eine
vollständige URI erzeugt und dem Browser ein
Redirect gesendet.
|
[R]
[R=303]
|
forbidden|F
|
Erzeuge ein HTTP-Code 403 (Forbidden)
|
[F]
|
gone|G
|
Sende einen HTTP-Code 410 (Gone)
|
[G]
|
proxy|P
|
Schließe die aktuelle Regel ab und übergibt
die Anfrage sofort an das Apache-Proxy-
Modul weiter. Die Abarbeitung des Rewrites
wird abgebrochen
|
[P]
|
last|L
|
Breche nach der aktuellen Regel die weitere
Prüfung der RewriteRegel ab (last Rule)
|
[L]
|
next|N
|
Beginne die RewriteRule noch einmal von
vorne (Achtung: Endlosschleifengefahr)
|
[N]
|
chain|C
|
"Chain"-Rules, d.h. bearbeite die aktuelle
Regel und wenn die Regel erfolgreich war,
nimm auch die nächste Regel - sonst
überspringe sie
|
[C]
|
type|T=MIME-TYPE
|
Erzwinge den MIME-TYPE für das Ergebnis
und triggere damit u.U. auch andere Module
|
[T=application/x-httpd-cgi]
|
nosubreq|NS
|
Übergehe die Regel, wenn die URL durch
einen internes Modul erzeugt wurde (z.B.
mod_include oder mod_alias)
|
[NS]
|
nocase|NC
|
Das PATTERN ist unabhängig von der Groß-
und Kleinschreibung.
|
[NC]
|
qsappend|QSA
|
füge den Query-String in der Substitution an -
ersetzte ihn nicht
|
[QSA]
|
noescape|NE
|
Die URL soll nicht encoded werden und
vorhandene URL-Codes werden decoded
|
/abc/(.*) /cde?arg=P1\%3d$1 [R,NE]
d.h.: /abc/xyz -> /cde?arg=P1=abc
|
skip|S=NUM
|
überspringe die nächsten NUM-Regeln
|
[S=10]
|
env|E=VAR:VAL
|
Belege die Umgebungsvariable VAR mit dem
Wert VAL
|
[E=VAR1=42]
|
cookie|CO=NAME:VAL:domain[:lifetime[:path]]
|
Setze das Cookie NAME. VAL ist der Wert,
Domain die Domain des Cookies, die
Lebenzeit und der Pfad ist der Pfad des
Cookies.
|
[CO=test:42:test.de]
|
Einige Beispiele für die Anfrage "GET /somepath/pathinfo" (globale Regeln):
Regel
|
Ergebnis
|
^/somepath(.*) otherpath$1
|
ungültig (wäre nur per Directory sinnvoll)
|
^/somepath(.*) otherpath$1
[R]
|
ungültig (wäre nur per Directory sinnvoll)
|
^/somepath(.*) otherpath$1
[P]
|
ungültig (wäre nur per Directory sinnvoll)
|
^/somepath(.*) /otherpath$1
|
/otherpath/pathinfo
|
^/somepath(.*) /otherpath$1
[R]
|
http://thishost/otherpath/pathinfo (ext. Redirect)
|
^/somepath(.*) /otherpath$1
[P]
|
unsinnig
|
^/somepath(.*) http://thishost/otherpath$1
|
/otherpath/pathinfo
|
^/somepath(.*) http://thishost/otherpath$1
[R]
|
http://thishost/otherpath/pathinfo (ext. Redirect)
|
^/somepath(.*) http://thishost/otherpath$1
[P]
|
unsinnig
|
^/somepath(.*) http://otherhost/otherpath$1
|
http://otherhost/otherpath/pathinfo (ext. Redirect)
|
^/somepath(.*) http://otherhost/otherpath$1
[R]
|
http://otherhost/otherpath/pathinfo (ext. Redirect)
|
^/somepath(.*) http://otherhost/otherpath$1
[P]
|
http://otherhost/otherpath/pathinfo (Proxy)
|
Einige Beispiele für die Anfrage "GET /somepath/localpath/pathinfo" für
den Directory-Container
"<Directory /somepath>":
Regel
|
Ergebnis
|
^localpath(.*) otherpath$1
|
/somepath/otherpath/pathinfo
|
^localpath(.*) otherpath$1
[R]
|
http://thishost/somepath/otherpath/pathinfo (ext Redirect)
|
^localpath(.*) otherpath$1
[P]
|
unsinnig
|
^localpath(.*) /otherpath$1
|
/otherpath/pathinfo
|
^localpath(.*) /otherpath$1
[R]
|
http://thishost/otherpath/pathinfo
|
^localpath(.*) /otherpath$1
[P]
|
unsinnig
|
^localpath(.*) http://thishost/otherpath$1
|
/otherpath/pathinfo
|
^localpath(.*) http://thishost/otherpath$1
[R]
|
http://thishost/otherpath/pathinfo (ext. Redirect)
|
^localpath(.*) http://thishost/otherpath$1
[P]
|
unsinnig
|
^localpath(.*) http://otherhost/otherpath$1
|
http://otherhost/otherpath/pathinfo (ext. Redirect)
|
^localpath(.*) http://otherhost/otherpath$1
[R]
|
http://otherhost/otherpath/pathinfo (ext. Redirect)
|
^localpath(.*) http://otherhost/otherpath$1
[P]
|
http://otherhost/otherpath/pathinfo (Proxy)
|