blob: 6074c56b6211291a11169b8694cb93ee6f8491bf [file]
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.de.xsl"?>
<!-- English Revision: 1933423:1935426 (outdated) -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manualpage metafile="intro.xml.meta">
<parentdocument href="./">Rewrite</parentdocument>
<title>Einführung in Apache mod_rewrite</title>
<summary>
<p>Dieses Dokument ergänzt die <module>mod_rewrite</module>
<a href="../mod/mod_rewrite.html">Referenzdokumentation</a>. Es
beschreibt die grundlegenden Konzepte, die für die Verwendung von
<module>mod_rewrite</module> notwendig sind. Andere Dokumente gehen
mehr ins Detail, aber dieses Dokument soll dem Anfänger den Einstieg
erleichtern.
</p>
</summary>
<seealso><a href="../mod/mod_rewrite.html">Moduldokumentation</a></seealso>
<!-- <seealso><a href="intro.html">Einführung in mod_rewrite</a></seealso> -->
<seealso><a href="remapping.html">Umleitung und Neuzuordnung</a></seealso>
<seealso><a href="access.html">Zugriffskontrolle</a></seealso>
<seealso><a href="vhosts.html">Virtuelle Hosts</a></seealso>
<seealso><a href="proxy.html">Proxying</a></seealso>
<seealso><a href="rewritemap.html">Verwendung von RewriteMap</a></seealso>
<seealso><a href="advanced.html">Fortgeschrittene Techniken</a></seealso>
<seealso><a href="avoid.html">Wann man mod_rewrite nicht verwenden sollte</a></seealso>
<section id="introduction"><title>Einführung</title>
<p>Das Apache-Modul <module>mod_rewrite</module> ist ein sehr
leistungsfähiges und ausgereiftes Modul, das eine Möglichkeit bietet,
URL-Manipulationen durchzuführen. Damit können Sie nahezu alle Arten von
URL-Umschreibungen durchführen, die Sie möglicherweise benötigen. Es ist
jedoch etwas komplex und kann für Anfänger einschüchternd sein. Es besteht
auch die Tendenz, Umschreibungsregeln als magische Formeln zu behandeln
und sie zu verwenden, ohne wirklich zu verstehen, was sie tun.</p>
<p>Dieses Dokument versucht, ausreichend Hintergrundwissen zu vermitteln,
damit das Folgende verstanden und nicht nur blind kopiert wird.
</p>
<p>Denken Sie daran, dass viele gängige URL-Manipulationsaufgaben nicht
die volle Leistungsfähigkeit und Komplexität von <module>mod_rewrite</module>
erfordern. Für einfache Aufgaben siehe <module>mod_alias</module> und die
Dokumentation zur <a href="../urlmapping.html">Zuordnung von URLs zum
Dateisystem</a>.</p>
<p>Stellen Sie schließlich vor dem Fortfahren sicher, dass Sie die
Protokollebene von <module>mod_rewrite</module> mit der
<directive module="core">LogLevel</directive>-Direktive auf eine der
Trace-Ebenen konfigurieren. Obwohl dies eine überwältigende Menge an
Informationen liefern kann, ist es unverzichtbar bei der Fehlersuche in
der <module>mod_rewrite</module>-Konfiguration, da es Ihnen genau zeigt,
wie jede Regel verarbeitet wird.</p>
</section>
<section id="regex"><title>Reguläre Ausdrücke</title>
<p><module>mod_rewrite</module> verwendet das Vokabular der <a
href="http://pcre.org/">Perl-kompatiblen regulären Ausdrücke</a>. In
diesem Dokument versuchen wir nicht, eine detaillierte Referenz zu
regulären Ausdrücken zu liefern. Dafür empfehlen wir die <a
href="http://pcre.org/pcre.txt">PCRE-Manpages</a>, die <a
href="http://perldoc.perl.org/perlre.html">Perl-Manpage für reguläre
Ausdrücke</a> und <a
href="https://www.oreilly.com/library/view/mastering-regular-expressions/0596528124/">Mastering
Regular Expressions von Jeffrey Friedl</a> (die dritte Auflage stammt
von 2006, aber die Syntax regulärer Ausdrücke ist im Wesentlichen
unverändert, und es bleibt die maßgebliche Referenz zu diesem Thema).</p>
<p>In diesem Dokument versuchen wir, genügend Regex-Vokabular zu
vermitteln, um Ihnen den Einstieg zu erleichtern, ohne Sie zu
überfordern, in der Hoffnung, dass <directive module="mod_rewrite"
>RewriteRule</directive>s wissenschaftliche Formeln sind und keine
magischen Beschwörungen.</p>
<section id="regexvocab"><title>Regex-Vokabular</title>
<p>Die folgenden sind die minimalen Bausteine, die Sie benötigen, um
reguläre Ausdrücke und <directive module="mod_rewrite">RewriteRule</directive>s
zu schreiben. Sie stellen sicherlich kein vollständiges Vokabular für
reguläre Ausdrücke dar, aber sie sind ein guter Ausgangspunkt und sollten
Ihnen helfen, grundlegende reguläre Ausdrücke zu lesen und eigene zu
schreiben.</p>
<table>
<tr>
<th>Zeichen</th>
<th>Bedeutung</th>
<th>Beispiel</th>
</tr>
<tr>
<td><code>.</code></td>
<td>Stimmt mit jedem einzelnen Zeichen überein</td>
<td><code>c.t</code> stimmt mit <code>cat</code>, <code>cot</code>,
<code>cut</code> usw. überein</td>
</tr>
<tr>
<td><code>+</code></td>
<td>Wiederholt die vorherige Übereinstimmung ein oder mehrmals</td>
<td><code>a+</code> stimmt mit <code>a</code>, <code>aa</code>,
<code>aaa</code> usw. überein</td>
</tr>
<tr>
<td><code>*</code></td>
<td>Wiederholt die vorherige Übereinstimmung null oder mehrmals</td>
<td><code>a*</code> stimmt mit allem überein, womit auch <code>a+</code>
übereinstimmt, aber auch mit einem leeren String</td>
</tr>
<tr>
<td><code>?</code></td>
<td>Macht die Übereinstimmung optional</td>
<td><code>colou?r</code> stimmt mit <code>color</code> und
<code>colour</code> überein</td>
</tr>
<tr>
<td><code>\</code></td>
<td>Maskiert das nächste Zeichen</td>
<td><code>\.</code> stimmt mit <code>.</code> (Punkt) überein und nicht
mit <em>jedem einzelnen Zeichen</em>, wie oben erklärt</td>
</tr>
<tr>
<td><code>^</code></td>
<td>Als Anker bezeichnet, stimmt mit dem Anfang des Strings überein</td>
<td><code>^a</code> stimmt mit einem String überein, der mit <code>a</code> beginnt</td>
</tr>
<tr>
<td><code>$</code></td>
<td>Der andere Anker, stimmt mit dem Ende des Strings überein</td>
<td><code>a$</code> stimmt mit einem String überein, der mit <code>a</code> endet</td>
</tr>
<tr>
<td><code>( )</code></td>
<td>Gruppiert mehrere Zeichen zu einer Einheit und erfasst eine
Übereinstimmung zur Verwendung als Rückreferenz</td>
<td><code>(ab)+</code> stimmt mit <code>ababab</code> überein - das heißt,
das <code>+</code> gilt für die Gruppe. Für mehr zu Rückreferenzen
siehe <a href="#InternalBackRefs">unten</a></td>
</tr>
<tr>
<td><code>[ ]</code></td>
<td>Eine Zeichenklasse - stimmt mit einem der Zeichen überein</td>
<td><code>c[uoa]t</code> stimmt mit <code>cut</code>, <code>cot</code> oder
<code>cat</code> überein</td>
</tr>
<tr>
<td><code>[^ ]</code></td>
<td>Negative Zeichenklasse - stimmt mit jedem nicht angegebenen Zeichen überein</td>
<td><code>c[^/]t</code> stimmt mit <code>cat</code> oder <code>c=t</code> überein,
aber nicht mit <code>c/t</code></td></tr>
</table>
<p>In <module>mod_rewrite</module> kann das Zeichen <code>!</code> vor
einem regulären Ausdruck verwendet werden, um ihn zu negieren. Das heißt,
ein String gilt nur dann als übereinstimmend, wenn er nicht mit dem Rest
des Ausdrucks übereinstimmt.</p>
</section>
<section id="InternalBackRefs"><title>Verfügbarkeit von Regex-Rückreferenzen</title>
<p>Hier ist eine wichtige Sache zu beachten: Wann immer Sie
Klammern in <em>Pattern</em> oder in einem der
<em>CondPattern</em> verwenden, werden intern Rückreferenzen
erstellt, die mit den Strings <code>$N</code> und <code>%N</code>
(siehe unten) verwendet werden können. Diese stehen für die
Erstellung des <em>Substitution</em>-Parameters einer
<directive module="mod_rewrite">RewriteRule</directive> oder des
<em>TestString</em>-Parameters einer
<directive module="mod_rewrite">RewriteCond</directive> zur Verfügung.</p>
<p>Erfassungen in den <directive module="mod_rewrite"
>RewriteRule</directive>-Mustern stehen (kontraintuitiv) allen
vorhergehenden <directive module="mod_rewrite">RewriteCond</directive>-Direktiven
zur Verfügung, da der <directive module="mod_rewrite">RewriteRule</directive>-Ausdruck
vor den einzelnen Bedingungen ausgewertet wird.</p>
<p>Abbildung 1 zeigt, an welche Stellen die Rückreferenzen zur
Expansion übertragen werden und illustriert den Ablauf der
RewriteRule-/RewriteCond-Zuordnung. In den nächsten Kapiteln
werden wir erkunden, wie diese Rückreferenzen verwendet werden,
also machen Sie sich keine Sorgen, wenn es Ihnen zunächst etwas
fremd erscheint.
</p>
<p class="figure">
<img src="../images/rewrite_backreferences.png"
alt="Ablauf der RewriteRule- und RewriteCond-Zuordnung" /><br />
<dfn>Abbildung 1:</dfn> Der Rückreferenz-Ablauf durch eine Regel.<br />
In diesem Beispiel würde eine Anfrage für <code>/test/1234</code> in <code>/admin.foo?page=test&amp;id=1234&amp;host=admin.example.com</code> umgewandelt.
</p>
</section>
</section>
<section id="rewriterule"><title>RewriteRule-Grundlagen</title>
<p>Eine <directive module="mod_rewrite">RewriteRule</directive> besteht
aus drei durch Leerzeichen getrennten Argumenten. Die Argumente sind:</p>
<ol>
<li><var>Pattern</var>: welche eingehenden URLs von der Regel betroffen sein sollen;</li>
<li><var>Substitution</var>: wohin die übereinstimmenden Anfragen gesendet werden sollen;</li>
<li><var>[flags]</var>: Optionen, die die umgeschriebene Anfrage beeinflussen.</li>
</ol>
<p>Das <var>Pattern</var> ist ein <a href="#regex">regulärer Ausdruck</a>.
Es wird anfänglich (für die erste Umschreibungsregel oder bis eine Ersetzung
erfolgt) gegen den URL-Pfad der eingehenden Anfrage abgeglichen (der Teil
nach dem Hostnamen, aber vor einem Fragezeichen, das den Beginn eines
Query-Strings anzeigt) oder im Verzeichniskontext gegen den Pfad der
Anfrage relativ zum Verzeichnis, für das die Regel definiert ist. Sobald
eine Ersetzung erfolgt ist, werden die folgenden Regeln gegen den
ersetzten Wert abgeglichen.
</p>
<p class="figure">
<img src="../images/syntax_rewriterule.png"
alt="Syntax der RewriteRule-Direktive" /><br />
<dfn>Abbildung 2:</dfn> Syntax der RewriteRule-Direktive.
</p>
<p>Die <var>Substitution</var> kann selbst eines von drei Dingen sein:</p>
<dl>
<dt>1. Ein vollständiger Dateisystempfad zu einer Ressource</dt>
<dd>
<highlight language="config">
RewriteRule "^/games" "/usr/local/games/web/puzzles.html"
</highlight>
<p>Dies bildet eine Anfrage auf einen beliebigen Ort in Ihrem Dateisystem ab,
ähnlich wie die <directive module="mod_alias">Alias</directive>-Direktive.</p>
</dd>
<dt>2. Ein Web-Pfad zu einer Ressource</dt>
<dd>
<highlight language="config">
RewriteRule "^/games$" "/puzzles.html"
</highlight>
<p>Wenn <directive module="core">DocumentRoot</directive> auf
<code>/usr/local/apache2/htdocs</code> gesetzt ist, würde diese Direktive
Anfragen für <code>http://example.com/games</code> auf den Pfad
<code>/usr/local/apache2/htdocs/puzzles.html</code> abbilden.</p>
</dd>
<dt>3. Eine absolute URL</dt>
<dd>
<highlight language="config">
RewriteRule "^/product/view$" "http://site2.example.com/seeproduct.html" [R]
</highlight>
<p>Dies weist den Client an, eine neue Anfrage für die angegebene URL zu
stellen.</p>
</dd>
</dl>
<note type="warning">Beachten Sie, dass <strong>1</strong> und <strong>2</strong> exakt dieselbe Syntax haben. Der Unterschied besteht darin, dass bei <strong>1</strong> die oberste Ebene des Zielpfads (d.h. <code>/usr/</code>) im Dateisystem existiert, während dies bei <strong>2</strong> nicht der Fall ist (d.h. es gibt kein <code>/bar/</code> als Verzeichnis auf der obersten Ebene im Dateisystem).</note>
<p>Die <var>Substitution</var> kann auch
<em>Rückreferenzen</em> auf Teile des eingehenden URL-Pfads enthalten,
die vom <var>Pattern</var> erfasst wurden. Betrachten Sie Folgendes:</p>
<highlight language="config">
RewriteRule "^/product/(.*)/view$" "/var/web/productdb/$1"
</highlight>
<p>Die Variable <code>$1</code> wird durch den Text ersetzt, der vom
Ausdruck innerhalb der Klammern im <var>Pattern</var> erfasst wurde.
Beispielsweise würde eine Anfrage für
<code>http://example.com/product/r14df/view</code> auf den Pfad
<code>/var/web/productdb/r14df</code> abgebildet.</p>
<p>Wenn mehr als ein Ausdruck in Klammern vorhanden ist, stehen sie
in der Reihenfolge in den Variablen <code>$1</code>, <code>$2</code>,
<code>$3</code> usw. zur Verfügung.</p>
</section>
<section id="flags"><title>Umschreibungs-Flags</title>
<p>Das Verhalten einer <directive
module="mod_rewrite">RewriteRule</directive> kann durch die Anwendung
eines oder mehrerer Flags am Ende der Regel modifiziert werden.
Beispielsweise kann das Übereinstimmungsverhalten einer Regel durch
die Anwendung des <code>[NC]</code>-Flags auf Groß-/Kleinschreibung
unempfindlich gemacht werden:
</p>
<highlight language="config">
RewriteRule "^puppy.html" "smalldog.html" [NC]
</highlight>
<p>Weitere Details zu den verfügbaren Flags, ihren Bedeutungen und
Beispiele finden Sie im Dokument <a href="flags.html">Umschreibungs-Flags</a>.</p>
</section>
<section id="rewritecond"><title>Umschreibungsbedingungen</title>
<p>Eine oder mehrere <directive module="mod_rewrite">RewriteCond</directive>-Direktiven
können verwendet werden, um die Typen von Anfragen einzuschränken, die der
nachfolgenden <directive module="mod_rewrite">RewriteRule</directive>
unterliegen. Das erste Argument ist eine Variable, die eine Eigenschaft
der Anfrage beschreibt, das zweite Argument ist ein <a href="#regex">regulärer
Ausdruck</a>, der mit der Variable übereinstimmen muss, und ein optionales
drittes Argument ist eine Liste von Flags, die die Art der Auswertung
der Übereinstimmung modifizieren.</p>
<p class="figure">
<img src="../images/syntax_rewritecond.png"
alt="Syntax der RewriteCond-Direktive" /><br />
<dfn>Abbildung 3:</dfn> Syntax der RewriteCond-Direktive
</p>
<p>Um beispielsweise alle Anfragen von einem bestimmten IP-Bereich an
einen anderen Server zu senden, könnten Sie Folgendes verwenden:</p>
<highlight language="config">
RewriteCond "%{REMOTE_ADDR}" "^10\.2\."
RewriteRule "(.*)" "http://intranet.example.com$1"
</highlight>
<p>Wenn mehr als eine <directive module="mod_rewrite">RewriteCond</directive>
angegeben wird, müssen alle übereinstimmen, damit die
<directive module="mod_rewrite">RewriteRule</directive> angewendet wird.
Um beispielsweise Anfragen abzulehnen, die das Wort "hack" in ihrem
Query-String enthalten, es sei denn, sie enthalten auch ein Cookie mit
dem Wort "go", könnten Sie Folgendes verwenden:</p>
<highlight language="config">
RewriteCond "%{QUERY_STRING}" "hack"
RewriteCond "%{HTTP_COOKIE}" !go
RewriteRule "." "-" [F]
</highlight>
<p>Beachten Sie, dass das Ausrufezeichen eine negative Übereinstimmung
angibt, sodass die Regel nur angewendet wird, wenn das Cookie nicht "go"
enthält.</p>
<p>Übereinstimmungen in den regulären Ausdrücken der
<directive module="mod_rewrite">RewriteCond</directive>s können als Teil
der <var>Substitution</var> in der
<directive module="mod_rewrite">RewriteRule</directive> über die Variablen
<code>%1</code>, <code>%2</code> usw. verwendet werden. Beispielsweise
leitet Folgendes die Anfrage abhängig vom für den Zugriff auf die Website
verwendeten Hostnamen in ein anderes Verzeichnis:</p>
<highlight language="config">
RewriteCond "%{HTTP_HOST}" "(.*)"
RewriteRule "^/(.*)" "/sites/%1/$1"
</highlight>
<p>Wenn die Anfrage für <code>http://example.com/foo/bar</code> war,
dann enthält <code>%1</code> den Wert <code>example.com</code> und
<code>$1</code> den Wert <code>foo/bar</code>.</p>
</section>
<section id="rewritemap"><title>Umschreibungs-Maps</title>
<p>Die <directive module="mod_rewrite">RewriteMap</directive>-Direktive
bietet eine Möglichkeit, sozusagen eine externe Funktion aufzurufen,
um Ihre Umschreibung durchzuführen. Dies wird im
<a href="rewritemap.html">ergänzenden RewriteMap-Dokument</a>
ausführlicher besprochen.</p>
</section>
<section id="htaccess"><title>.htaccess-Dateien</title>
<p>Umschreibungen werden typischerweise in der Hauptserverkonfiguration
(außerhalb eines <directive type="section" module="core">Directory</directive>-Abschnitts)
oder innerhalb von <directive type="section" module="core">VirtualHost</directive>-Containern
konfiguriert. Dies ist die einfachste Art, Umschreibungen durchzuführen,
und wird empfohlen. Es ist jedoch möglich, Umschreibungen innerhalb von
<directive type="section" module="core">Directory</directive>-Abschnitten
oder <a href="../howto/htaccess.html"><code>.htaccess</code>-Dateien</a>
auf Kosten zusätzlicher Komplexität durchzuführen. Diese Technik wird
als verzeichnisbasierte Umschreibung bezeichnet.</p>
<p>Der Hauptunterschied zu serverweiten Umschreibungen besteht darin, dass
der Pfadpräfix des Verzeichnisses, das die <code>.htaccess</code>-Datei
enthält, vor dem Abgleich in der <directive module="mod_rewrite">RewriteRule</directive>
entfernt wird. Zusätzlich sollte <directive module="mod_rewrite">RewriteBase</directive>
verwendet werden, um sicherzustellen, dass die Anfrage korrekt zugeordnet wird.</p>
</section>
</manualpage>