<?xml version="1.0"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.de.xsl"?>
<modulesynopsis metafile="mod_rewrite.xml.meta">

<name>mod_rewrite</name> 

<description>Eine auf Regeln basierende Rewriting Engine zum Umschreiben
angeforderter URLs</description>

<status>Erweiterung</status>
<sourcefile>mod_rewrite.c</sourcefile>
<identifier>rewrite_module</identifier>
<compatibility>Ab Apache 1.3</compatibility>

<summary>
      <blockquote>
            <p>``Das Gro&szlig;artige an <code>mod_rewrite</code> ist,
            dass das Modul so anpassungsf&auml;hig und flexibel
            wie Sendmail ist. Der Nachteil an <code>mod_rewrite</code> ist,
            dass das Modul so anpassungsf&auml;hig und flexibel
            wie Sendmail ist..''</p>

            <p class="cite">-- <cite>Brian Behlendorf</cite><br />
            Apache Group</p>

      </blockquote>

      <blockquote>
            <p>`` Despite the tons of examples und docs,
            mod_rewrite is voodoo. Damned cool voodoo, but still
            voodoo. ''</p>

            <p class="cite">-- <cite>Brian Moore</cite><br />
            [EMAIL PROTECTED]</p>

      </blockquote>


      <p>Herzlich willkommen zu <code>mod_rewrite</code>, dem
      Allroundwerkzeug f&uuml;r die URL-Manipulation!</p>

      <p>Dieses Modul verwendet eine auf Regeln basierende
      Rewriting Engine, die mit Hilfe eines Parsers f&uuml;r regul&auml;re 
Ausdr&uuml;cke
      angeforderte URLs im Vorbeigehen umschreibt.
      Es unterst&uuml;tzt eine unbegrenzte Anzahl von Regeln
      Bedingungen f&uuml;r jede einzelne Regel,
      um einen wirklich flexiblen und leistungsf&auml;higen Mechanismus
      f&uuml;r die URL-Manipulation bereitzustellen. Die URL-Manipulationen
      k&ouml;nnen in Abh&auml;ngigkeit von unterschiedlichen Tests 
durchgef&uuml;hrt
      werden, beispielsweise in Abh&auml;ngigkeit von Servervariablen,
      Umgebungsvariablen, HTTP-Headern und Zeitstempeln. Selbst die
      Suchergebnisse in externen Datenbanken unterschiedlicher
      Formate k&ouml;nnen f&uuml;r einen fein abgestimmten URL-Vergleich 
herangezogen
      werden.</p>

      <p>Das Modul arbeitet mit den vollst&auml;ndigen URLs 
(einschlie&szlig;lich
      der Pfadinformationen) im Server-  und Verzeichniskontext
      (<code>httpd.conf</code> und <code>.htaccess</code>). Es kann
      sogar Teile von Abfragezeichenfolgen
      als Ergebnis liefern. Das umgeschriebene Ergebnis kann zur internen
      Weiterverarbeitung, zu externen Anfrageumleitungen oder auch zu
      internem Proxy-Durchsatz f&uuml;hren.</p>

      <p>Aber all diese Funktionalit&auml;t und Flexibilt&auml;t hat einen 
Nachteil,
      n&auml;mlich die Komplexit&auml;t. Daher ist das Modul in seinem
      gesamten Umfang auch nicht einfach und leicht zu verstehen.</p>

      <p>Das Modul wurde im April 1996 entwickelt und im Juli 1997
      von</p>

      <p class="indent">
        <a href="http://www.engelschall.com/";><code>Ralf S.
        Engelschall</code></a><br />
         <a
        href="mailto:[EMAIL PROTECTED]"><code>[EMAIL PROTECTED]</code></a><br />
         <a
        
href="http://www.engelschall.com/";><code>www.engelschall.com</code></a></p>
  
     <p>der Apache Group exklusiv &uuml;berlassen.</p>
</summary>

<section id="Internal"><title>Interne Verarbeitung</title>

      <p>Die interne Verarbeitung ist sehr komplex, auf eine Erkl&auml;rung kann
      aber auch f&uuml;r den einfachen Benutzer nicht verzichtet werden, um weit
      verbreitete Fehler zu vermeiden und die gesamte Funktionalit&auml;t nutzen
      zu k&ouml;nnen.</p>

<section id="InternalAPI"><title>API-Phasen</title>

      <p>Wichtig f&uuml;r das Verst&auml;ndnis sind die Phasen der Verarbeitung 
einer
      HTTP-Anfrage durch den Server. Die Apache-API stellt f&uuml;r jede
      dieser Phasen einen Hook zur Verf&uuml;gung. <code>Mod_rewrite</code>
      benutzt zwei dieser Hooks: Zum einen den Umwandlungs-Hook f&uuml;r URLs
      in Dateinamen, der eingesetzt wird, nachdem die HTTP-Anfrage gelesen
      aber noch bevor eine Authorisierung durchgef&uuml;hrt wurde. Und zum
      anderen den Fixup-Hook, der nach der Authorisierungsphase und
      nach dem Lesen der Verzeichnis-Konfigurationsdateien
      (<code>.htaccess</code>), aber noch vor der Aktivierung des
      Content-Handler, ausgel&ouml;st wird.</p>

      <p>Hat der Apache nach Eingang einer Anfrage den
      entsprechenden Server (oder virtuellen Server) ermittelt, beginnt
      die Rewriting Engine in der Phase der Umwandlung von URL in Dateiname
       mit der Verarbeitung aller <code>mod_rewrite</code>- Direktiven
       aus der Serverkonfiguration. Nachdem die letzten Datenverzeichnisse
       gefunden wurden, werden die <code>mod_rewrite</code>-Dirketiven
       f&uuml;r die Verzeichniskonfiguration in der Fixup-Phase ausgel&ouml;st. 
In
       beiden F&auml;llen schreibt <code>mod_rewrite</code> URLs entweder
       in neue URLs oder Dateinamen um, auch wenn es f&uuml;r beide kein
       erkennbares Unterscheidungsmerkmal gibt. Diese Verwendung der API
       war urspr&uuml;nglich nicht beabsichtigt, aber seit der Apache-Version 
1.x
       ist dies die einzige M&ouml;glichkeit, wie <code>mod_rewrite</code>
       arbeiten kann. Um dies etwas zu verdeutlichen, sei an die
       beiden folgenden Punkte erinnert:</p>

      <ol>
        <li>Obwohl <code>mod_rewrite</code> URLs in URLs, URLs in
        Dateinamen und auch Dateinamen in Dateinamen umschreibt, besitzt
        die API zur Zeit lediglich einen Hook f&uuml;r die Umwandlung von
        URLs in Dateinamen. Mit Apache 2.0 werden die beiden fehlenden
        Hooks hinzugef&uuml;gt, um die Verarbeitung klarer zu machen. F&uuml;r 
den
        Benutzer bringt das keine Nachteile, es sollte aber beachtet
        werden, dass der Apache mit dem Hook f&uuml;r die Umwandlung von
        URLs in Dateinamen mehr leistet, als f&uuml;r die API urspr&uuml;nglich
        vorgesehen war.</li>

        <li>
          Erstaunlicherweise erm&ouml;glicht <code>mod_rewrite</code>
          URL-Manipulationen im Verzeichniskontext
          (<code>.htaccess</code>-Dateien), obwohl dieser erst wesentlich
          sp&auml;ter nach der erfolgten Umwandlung der URLs in Dateinamen
          erreicht wird. Das muss geschehen, weil
          <code>.htaccess</code>-Dateien zum Dateisystem geh&ouml;ren, so
          dass die Verarbeitung bereits diesen Stand erreicht hat. Oder anders
          ausgedr&uuml;ckt: Entsprechend der API-Phasen ist es zu diesem 
Zeitpunkt
          zu sp&auml;t f&uuml;r URL-Manipulationen. Dieses Problem wird mit 
einem
          Trick umgangen: Wird eine URL oder ein Dateiname im Verzeichniskontext
          manipuliert, schreibt das Modul zuerst den Dateinamen wieder in die
          entsprechende URL um, was normalerweise unm&ouml;glich ist. Im
          Zusammenhang mit der <code>RewriteBase</code>-Direktive weiter
          unten wird aber beschrieben, wie dies zu realisieren ist. 
Anschlie&szlig;end
          wird eine neue interne Unteranfrage mit der neuen URL ausgel&ouml;st.
          Damit wird die Verarbeitung der API-Phasen erneut gestartet. 

          <p>Zwar wird versucht, diesen komplizierten Schritt f&uuml;r den
          Benutzer v&ouml;llig transparent zu machen, dabei ist aber folgendes 
zu
          ber&uuml;cksichtigen: W&auml;hrend URL-Manipulationen im Serverkontext
          wirklich schnell und effizient sind, verl&auml;uft das Umschreiben im
          Verzeichniskontext infolge des beschriebenen Problems
          langsam und ineffizient. Andererseits ist dies die einzige 
M&ouml;glichkeit,
          wie <code>mod_rewrite</code> lokal beschr&auml;nkte
          URL-Manipulationen f&uuml;r den einfachen Benutzer anbieten kann.</p>
        </li>
      </ol>

      <p>Ber&uuml;cksichtigen Sie diese beiden Punkte!</p>
</section>

<section id="InternalRuleset"><title>Verarbeitung von Regels&auml;tzen</title>
 
      <p>Wenn <code>mod_rewrite</code> in diesen beiden API-Phasen
      in Aktion tritt, werden die vorgegebenen Regeln aus der 
Konfigurationsstruktur
      gelesen, die entweder beim Serverstart f&uuml;r den Serverkontext oder
      w&auml;hrend des Verzeichnisdurchlaufs des Apache-Kerns f&uuml;r den
      Verzeichniskontext erzeugt wurde.Anschlie&szlig;end wird die
      URL-Rewriting Engine mit diesem Regelsatz (eine oder mehre Regeln mit
      den dazugeh&ouml;rigen Bedingungen) gestartet. Der Ablauf ist bei der
      Rewriting Engine f&uuml;r beide Konfigurationszusammenh&auml;nge genau der
      gleiche. Nur die Verarbeitung der Ergebnisse unterscheidet sich. </p>

      <p>Die Reihenfolge der Regeln im Regelsatz ist von Bedeutung,
      weil die Rewriting Engine sie in einer besonderen (nicht unmittelbar
      verst&auml;ndlichen) Reihenfolge verarbeitet. Es gilt: Die Rewriting 
Engine
      geht Regel f&uuml;r Regel durch den Regelsatz (<directive
      module="mod_rewrite">RewriteRule</directive>-Direktiven). Tritt eine
      bestimmte Regel in Kraft, werden optional die entsprechenden
      Bedingungen durchlaufen (<code>RewriteCond</code>-
      Direktiven). Aus Gr&uuml;nden der Entwicklungsgeschichte stehen die
      Bedingungen am Beginn, so dass die Flusskontrolle etwas langwierig
      ist. Weitere Einzelheiten finden Sie in Abbildung 1.</p>
<p class="figure">
      <img src="../images/mod_rewrite_fig1.gif" width="428"
           height="385" alt="[Needs graphics capability to display]" /><br />
      <dfn>Abbildung 1:</dfn>Die Flu&szlig;kontrolle bei den Manipulationregeln
</p>
      <p>Wie die Abbildung zeigt, wird die erste URL mit dem
      <em>Muster</em> jeder Regel verglichen. Gibt es keine
      &Uuml;bereinstimmung, bricht <code>mod_rewrite</code> die Verarbeitung
      dieser Regel sofort ab und f&auml;hrt mit der n&auml;chsten Regel fort. 
Stimmt
      das <em>Muster</em> &uuml;berein, sucht das Modul nach Bedingungen
      f&uuml;r die Regel. Sind keine vorhanden, wird die URL einfach durch einen
      neuen Wert ersetzt, der aus der Zeichenfolge <em>Substitution</em>
      gebildet wird und durchl&auml;uft anschlie&szlig;end wieder die Regeln. 
Sind aber
      Bedingungen vorhanden, wird eine innere Schleife f&uuml;r ihre 
Verarbeitung
      in der aufgef&uuml;hrten Reihenfolge begonnen. Bei Bedingungen ist die 
Logik
      eine andere: Es wird nicht das Muster mit der aktuellen URL verglichen,
      sondern mit Hilfe von Variablen, R&uuml;ckverweisen, Map-Suchen usw.
      die Zeichenfolge <em>TestString</em> konstruiert und mit
       <em>BedMuster</em> verglichen. Stimmt das Muster nicht &uuml;berein,
      treffen alle Bedingungen und die dazugeh&ouml;rige Regel nicht zu.
      Stimmt das Muster &uuml;berein, wird jeweils die n&auml;chste Bedingung
      verarbeitet, bis keine Bedingungen mehr vorliegen. Treffen alle
      Bedingungen zu, wird mit der Ersetzung der URL durch
      <em>Substitution</em> fortgefahren.</p>

</section>

<section id="quoting"><title>Sonderzeichen</title>

      <p>Seit der Apache-Version 1.3.20 k&ouml;nnen Sonderzeichen in
      <em>TestString</em> und <em>Substitution</em> durch
      Voranstellung eines Schr&auml;gstrichs ('\') gekennzeichnet werden, wenn
      sie wie normale Zeichen behandelt werden sollen. Die Zeichenfolge
      <em>Substitution</em> darf also beispielsweise bei der Schreibweise
      <code>\$</code> ein Dollarzeichen enthalten, ohne dass dies als 
R&uuml;ckverweis
      gewertet wird.</p>
</section>

<section id="InternalBackRefs"><title>R&uuml;ckverweise</title>

      <p>Werden im <em>Muster</em> oder in einer der Variablen
      <em>BedMuster</em> Klammern gesetzt, werden internR&uuml;ckverweise
      erzeugt, die &uuml;ber die Zeichenfolgen <code>$N</code> und
      <code>%N</code> benutzt werden k&ouml;nnen (siehe unten). Sie
      stehen f&uuml;r die Bildung der Zeichenfolgen <em>Substitution</em> und
      <em>TestString</em> zur Verf&uuml;gung. Abbildung 2 zeigt, auf welche
      Positionen sich die R&uuml;ckverweise beziehen.</p>

<p class="figure">
      <img src="../images/mod_rewrite_fig2.gif" width="381"
           height="179" alt="[Needs graphics capability to display]" /><br />
      <dfn>Abbildung 2:</dfn> Fluss der R&uuml;ckverweise bei Regeln.
</p>
      <p>Dieser kleine Crashkurs &uuml;ber die inneren Abl&auml;ufe des Moduls
      <code>mod_rewrite</code> soll das Verst&auml;ndnis
      der folgenden Dokumentation der verf&uuml;gbaren Direktiven 
erleichtern.</p>

</section>
</section>

<section id="EnvVar"><title>Umgebungsvariablen</title>

      <p>Das Modul zeichnet zwei zus&auml;tzliche (nicht 
standardm&auml;&szlig;ige)
      CGI/SSI-Umgebungsvariablen mit den Bezeichnungen
      <code>SCRIPT_URL</code> und <code>SCRIPT_URI</code> auf.
      Sie enthalten die <em>logische</em> Web-Sicht auf die aktuelle
      Ressource, w&auml;hrend die standardm&auml;&szlig;igen CGI/SSI-Variablen
      <code>SCRIPT_NAME</code> und <code>SCRIPT_FILENAME</code>
      die <em>physische</em> Systemsicht enthalten. </p>

      <p>Hinweis: Diese Variablen speichern die URI/URL <em>wie sie
      urspr&uuml;nglich angefordert wurde</em>, d.h. <em>bevor</em>
      etwas umgeschrieben wurde. Das ist wichtig, weil der Vorgang des
      Umschreibens prim&auml;r dazu dient, logische URLs in physische
      Pfadnamen umzuschreiben.</p>

<example><title>Beispiel</title>
<pre>
SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
SCRIPT_FILENAME=/u/rse/.www/index.html
SCRIPT_URL=/u/rse/
SCRIPT_URI=http://en1.engelschall.com/u/rse/
</pre>
</example>

</section>

<section id="Solutions"><title>Praktische L&ouml;sungen</title>

      <p>Unter <a href="../misc/rewriteguide.html">Einf&uuml;hrung in die
      URL-Manipulationen</a> finden Sie eine Sammlung praktischer
      L&ouml;sungen f&uuml;r Probleme mit URLs. Dort finden Sie auch
      Regels&auml;tze f&uuml;r den praktischen Einsatz sowie weiter 
Informationen zum
      Modul <code>mod_rewrite</code>.</p>
</section>


<directivesynopsis>
<name>RewriteEngine</name>
<description>Aktiviert oder deaktiviert die Rewriting Engine.</description>
<syntax>RewriteEngine on|off</syntax>
<default>RewriteEngine off</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>FileInfo</override>

<usage>       

      <p>Die <directive>RewriteEngine</directive>-Direktive aktiviert oder
      deaktiviert die Rewriting Engine. Wird sie auf <code>off</code> gesetzt,
      f&uuml;hrt dieses Modul keine Verarbeitung w&auml;hrend der Laufzeit 
durch.
      Auch die Umgebungsvariablen <code>SCRIPT_URx</code>
      werden nicht aktualisiert.</p>

      <p>Das Modul sollte mit dieser Direktive deaktiviert werden, anstatt die
      <directive module="mod_rewrite">RewriteRule</directive>-Direktiven
      als Kommentarzeilen zu kennzeichnen.</p>

      <p>Die Rewrite-Einstellungen werden standardm&auml;&szlig;ig nicht 
vererbt.
      Das bedeutet, dass f&uuml;r jeden virtuellen Host, f&uuml;r die sie 
wirksam werden sollen,
      die <code>RewriteEngine</code>-Direktive auf <code>on</code>
      gesetzt werden muss.</p>
</usage>

</directivesynopsis>

<directivesynopsis>
<name>RewriteOptions</name>
<description>Setzt einige spezielle Optionen f&uuml;r die Rewriting 
Engine</description>
<syntax>RewriteOptions <var>Option</var></syntax>
<default>RewriteOptions MaxRedirects=10</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>FileInfo</override>
<compatibility><code>MaxRedirects</code> steht seit der Apache-Version
2.0.45 zur Verf&uuml;gung.</compatibility>
<usage>

      <p>Mit der <directive>RewriteOptions</directive>-Direktive k&ouml;nnen
      spezielle Optionen f&uuml;r die Server oder Verzeichnisse gesetzt werden.
      Als <em>Option</em> kann angegeben werden:</p>

      <dl>
      <dt><code>inherit</code></dt>
      <dd>Die aktuelle Konfiguration erbt die &uuml;bergeordnete
      Konfiguration. F&uuml;r den <code>VirtualHost</code>-Abschnitt bedeutet
      das, dass die Maps, Bedingungen und Regeln des Hauptservers
      &uuml;bernommen werden. Auf der Verzeichnisebene werden die Bedingungen
      und Regeln der <code>.htaccess</code>-Konfiguration des 
&uuml;bergeordneten
      Verzeichnisses &uuml;bernommen.</dd>

      <dt><code>MaxRedirects=<var>Anzahl</var></code></dt>
      <dd>Um Endlosschleifen durch interne Umleitungen (ausgel&ouml;st durch
      <directive module="mod_rewrite">RewriteRule</directive>)
      zu verhindern, bricht <module>mod_rewrite</module> die Anfrage
      nach Erreichen der maximalen Anzahl von Umleitungen ab und
      antwortet mit <code>500 Internal Server Error</code>. Werden
      tats&auml;chlich mehr als 10 Umleitungen pro Anfrage ben&ouml;tigt, kann
      der Standardwert erh&ouml;ht werden.</dd>
      </dl>
</usage>

</directivesynopsis>

<directivesynopsis>
<name>RewriteLog</name>
<description>Gibt den Namen der Protokolldatei f&uuml;r die Aktionen der 
Rewriting
 Engine an.</description>
<syntax>RewriteLog <em>Dateipfad</em></syntax>
<contextlist><context>server config</context><context>virtual host</context>
</contextlist>

<usage>
      <p>Die <directive>RewriteLog</directive>-Direktive gibt den Namen
      der Protokolldatei an, in der der Server durchgef&uuml;hrte Manipulationen
      protokolliert. Beginnt der Name nicht mit einem
      Schr&auml;gstrich (<code>/</code>), wird er relativ zur
      <em>Server Root</em> interpretiert. Die Direktive sollte nur einmal
      in der Serverkonfiguration erscheinen.</p>

<note>Um die Protokollierung von Manipulationen zu deaktivieren,
sollte nicht <code>/dev/null</code> als <em>Dateiname</em> angegeben
werden, weil die Rewriting Engine dann zwar keine Ausgaben in eine
Protokolldatei schreibt, diese Ausgaben aber trotzdem intern erzeugt werden,
<strong>was zu einer &uuml;berfl&uuml;ssigen Belastung des Servers f&uuml;hrt 
.</strong>
Stattdessen sollte die <directive>RewriteLog</directive>-Direktive entfernt,
als Kommentar gekennzeichnet oder der
<code>RewriteLogLevel</code> auf <code>0</code> gesetzt werden.
</note>

<note type="securitywarning"><title>Sicherheit</title>

Unter <a href="../misc/security_tips.html">Tipps zur Sicherheit</a>
finden Sie weitere Einzelheiten dazu, warum die Sicherheit gef&auml;hrdet ist, 
wenn
jemand anders als derjenige, der den Server gestartet hat, in das Verzeichnis
mit den Protokolldateien schreiben darf.
</note>

<example><title>Beispiel</title>
RewriteLog "/usr/local/var/apache/logs/rewrite.log"
</example>

</usage>

</directivesynopsis>

<directivesynopsis>
<name>RewriteLogLevel</name>
<description>Legt die Ausf&uuml;hrlichkeit der Eintr&auml;ge der Rewriting
Engine in die Protokolldatei fest.</description>
<syntax>RewriteLogLevel <em>Level</em></syntax>
<default>RewriteLogLevel 0</default>
<contextlist><context>server config</context><context>virtual host</context>
</contextlist>

<usage>
      <p>Die <directive>RewriteLogLevel</directive>-Direktive legt die
       die Ebene der Ausf&uuml;hrlichkeit f&uuml;r das Manipulationsprotokoll 
fest. Bei der
       Standardeinstellung <code>0</code> erfolgte keine Protokollierung
       und bei der Einstellung <code>9</code> oder h&ouml;her werden praktisch
       alle Aktionen aufgezeichnet.</p>

      <p>Wird f&uuml;r <em>Level </em> <code>0</code> angegeben, werden
      keine Aktionen protokolliert.</p>

<note> Umso h&ouml;her der f&uuml;r <em>Level</em> angegebene Wert ist, um so
st&auml;rker verlangsamt sich der Apache-Server. Ein h&ouml;herer Wert als 
<code>2</code>
sollte nur f&uuml;r die Fehlersuche benutzt werden.
</note>

<example><title>Beispiel</title>
RewriteLogLevel 3
</example>

</usage>

</directivesynopsis>

<directivesynopsis>
<name>RewriteLock</name>
<description>Gibt den Namen der Sperrdatei f&uuml;r die
<directive module="mod_rewrite">RewriteMap</directive>-
Synchronisation an.</description>
<syntax>RewriteLock <em>Dateipfad</em></syntax>
<contextlist><context>server config</context></contextlist>

<usage>
      <p>Diese Direktive gibt den Dateinamen f&uuml;r Sperreintr&auml;ge zur
   Synchronisation zwischen <code>mod_rewrite</code> 
   und <directive 
   module="mod_rewrite">RewriteMap</directive>-<em>Programmen</em>
   an. Bei Verwendung eines Map-Programms sollte ein lokaler Pfad
   und kein eingebundens NFS-Dateisystem angegeben werden. Die
   Direktive muss nur f&uuml;r diese Art von Map-Programmen angegeben 
werden.</p>
</usage>

</directivesynopsis>

<directivesynopsis>
<name>RewriteMap</name>
<description>Definiert eine Mapping-Funktion f&uuml;r die 
Schl&uuml;sselsuche.</description>
<syntax>RewriteMap <em>MapName</em> <em> MapTyp</em>:<em>MapQuelle</em>
</syntax>
<contextlist><context>server config</context><context>virtual host</context>
</contextlist>
<compatibility>Die Auswahl zwischen mehreren DBM-Typen steht
seit Apache 2.0.41 zur Verf&uuml;gung.</compatibility>

<usage>
      <p>Die <directive>RewriteMap</directive>-Direktive definiert ein
      <em>Rewriting Map</em>, das in Ersetzungszeichenfolgen f&uuml;r Regeln
      von den Mapping-Funktionen f&uuml;r das Einf&uuml;gen oder Ersetzen von 
Feldern
      &uuml;ber eine Schl&uuml;sselsuche benutzt werden kann. Die Suche kann in 
Quellen
      unterschiedlichen Typs erfolgen.</p>

      <p>&Uuml;ber das namentlich angegebene Map wird eine Mapping-Funktion
      f&uuml;r die Ersetzungszeichenfolgen einer Manipulationregel wie folgt
      angegeben:</p>

      <p class="indent">
        <strong><code>${</code> <em>MapName</em> <code>:</code>
        <em>Schl&uuml;ssel</em> <code>}</code><br />
         <code>${</code> <em>MapName</em> <code>:</code>
        <em>Schl&uuml;ssel</em> <code>|</code> <em>Standardwert</em>
        <code>}</code></strong>
      </p>

      <p>Taucht so ein Konstrukt im Map auf, wird im mit <em>MapName</em>
      angegebenen Map nachgesehen und der <em>Schl&uuml;ssel</em> gesucht.
      Wird er gefunden, wird das Konstrukt durch <em>SubstWert</em>
      ersetzt. Wird der Schl&uuml;ssel nicht gefunden, wird es durch den
      <em>Standardwert</em> oder, falls dieser nicht angegeben wurde,
      durch eine leere Zeichenfolge ersetzt.</p>

      <p>Die folgenden Kombinationen f&uuml;r <em>MapTyp</em> und
      <em>MapQuelle</em> k&ouml;nnen verwendet werden:</p>

      <ul>
        <li>
          <strong>Text</strong><br />
           <code>MapType</code>: <code>txt</code>, <code>MapQuelle</code>: 
Unix-Pfad zu einer Datei

          <p>Dies ist die standardm&auml;&szlig;ige Map-Umschreibung, bei der
<em>MapQuelle</em> eine ASCII-Datei mit Leerzeilen, Kommentarzeilen
mit einem <code>#</code>-Zeichen am Anfang oder Paaren wie den folgenden
(jeweils eines pro Zeile) ist:</p>

          <p class="indent">
            <strong><em>MatchingKey</em>
            <em>SubstWert</em></strong>
          </p>

<example><title>Beispiel</title>
<pre>
##
##  map.txt -- Rewriting-Map
##

Ralf.S.Engelschall    rse   # Bastard Operator From Hell
Mr.Joe.Average        joe   # Mr. Average
</pre>
</example>

<example>
RewriteMap real-to-user txt:/Pfad/zu/Datei/map.txt
</example>
        </li>

        <li>
          <strong>Random-Text</strong><br />
           <code>MapType</code>: <code>rnd</code>, <code>MapQuelle</code>: 
Unix-Pfad zu regul&auml;rer Datei

          <p>Diese Variante ist mit der oben aufgef&uuml;hrten Text-Variante 
identisch,
          besitzt aber eine speziele Nachbearbeitungseigenschaft: Nach dem ein 
Wert
          gefunden wurde, wird er nach enthaltenen <code>|</code>-Zeichen
          untersucht, die f&uuml;r "oder" stehen. Sie kennzeichnen eine Reihe 
von
          Alternativen, aus denen der tats&auml;chlich zur&uuml;ckgegebene Wert 
zuf&auml;llig
          ausgew&auml;hlt wird. Auch wenn das nicht einleuchtend erscheinen mag,
          das Verfahren wurde urspr&uuml;nglich f&uuml;r den Lastausgleich bei
          Reverse-Proxies entwickelt, wo es sich bei den gesuchten Werten
          um Servernamen handelt. Beispiel:</p>

<example>
<pre>
##
##  map.txt -- Rewriting-Map
##

static   www1|www2|www3|www4
dynamic  www5|www6
</pre>
</example>

<example>
RewriteMap servers rnd:/Pfad/zu/Datei/map.txt
</example>
        </li>

        <li>
          <strong>Hash-Datei</strong><br /> <code>MapType</code>:
          <code>dbm[=<em>type</em>]</code>, <code>MapQuelle</code>: Unix-Pfad 
zu einer
          regul&auml;ren Datei

          <p>Die Quelle ist eine bin&auml;re DBM-Datei mit dem gleichen Inhalt
          wie eine <em>Textdatei</em>, der jedoch f&uuml;r ein sehr schnelles 
Suchen
          besonders aufbereitet wurde. Der <em>Typ </em> kann je nach den
          Kompilereinstellungen <code>sdbm</code>, <code>gdbm</code>,
          <code>ndbm</code> oder <code>db</code> sein. Wird der
          <em>Typ</em> weggelassen, wird die Standardvorgabe genommen.
          Eine solche Datei kann mit einem DBM-Programm oder dem folgenden
          Perl-Skript erstellt werden. Nehmen Sie die entsprechenden Anpassungen
          f&uuml;r den zu erzeugenden DBM-Typ vor. Das Beispiel erzeugt eine
          NDBM-Datei.</p>

<example>
<pre>
#!/path/to/bin/perl
##
##  txt2dbm -- Umwandlung txt map in dbm-Format
##

use NDBM_File;
use Fcntl;

($txtmap, $dbmmap) = @ARGV;

open(TXT, "&lt;$txtmap") or die "Couldn't open $txtmap!\n";
tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
  or die "Couldn't create $dbmmap!\n";

while (&lt;TXT&gt;) {
  next if (/^\s*#/ oder /^\s*$/);
  $DB{$1} = $2 if (/^\s*(\S+)\s+(\S+)/);
}

untie %DB;
close(TXT);
</pre>
</example>

<example>
$ txt2dbm map.txt map.db
</example>
        </li>

        <li>
          <strong>Intern</strong><br />
           <code>MapType</code>: <code>int</code>, <code>MapQuelle</code>: 
Interne Apache-Funktion
           
          <p>Diesmal ist die Quelle eine interne Apache-Funktion.
          Zur Zeit k&ouml;nnen keine eigenen Funktionen eingerichtet werden,
          die folgenden Funktionen sind aber bereits vorhanden:</p>

          <ul>
            <li><strong>toupper</strong>:<br />
             Wandelt den gesuchten Schl&uuml;ssel in Gro&szlig;buchstaben 
um.</li>

            <li><strong>tolower</strong>:<br />
             Wandelt den gesuchten Schl&uuml;ssel in Kleinbuchstaben um.</li>

            <li><strong>escape</strong>:<br />
             Wandelt Sonderzeichen im gesuchten Schl&uuml;ssel in hexadezimale
             Kodierung um.</li>

            <li><strong>unescape</strong>:<br />
             Wandelt hexadezimale Kodierungen wieder zur&uuml;ck in 
Sonderzeichen.</li>
          </ul>
        </li>

        <li>
          <strong>Externes Rewriting-Programm</strong><br />
           <code>MapType</code>: <code>prg</code>, <code>MapQuelle</code>
           : Unix-Pfad zu einer regul&auml;ren Datei

          <p>In diesem Fall ist ein Programm und nicht eine Map-Datei die 
Quelle.
          Es kann mit einer beliebigen Programmiersprache erstellt werden, muss
          aber ausf&uuml;hrbar sein (Objektcode oder ein Skript mit dem Magic
          Cookie-Trick <code>#!/Pfad/zum/Interpreter</code> als erste
          Zeile).</p>

          <p>Das Programm wird einmal beim Start des Apache-Servers
          aufgerufen und kommuniziert dann &uuml;ber <code>stdin</code> und
          <code>stdout</code> mit der Rewriting Engine. Bei jeder
          Map-Funktionssuche erh&auml;lt es &uuml;ber <code>stdin</code> den
          Suchschl&uuml;ssel als Zeichenfolge mit einem Zeilenvorschub am 
Schluss.
          Der gefundene Wert wird ebenfalls als Zeichenfolge mit einem
          Zeilenvorschub &uuml;ber <code>stdout</code> zur&uuml;ckgegeben. 
Liegt kein
          Wert f&uuml;r den Schl&uuml;ssel vor, wird <code>NULL</code> 
zur&uuml;ckgeliefert.
          Ein einfaches Programmm, das ein 1:1-Map (<code>Schl&uuml;ssel==
          Wert</code>) implementiert, k&ouml;nnte folgenderma&szlig;en 
aussehen:</p>

<example>
<pre>
#!/usr/bin/perl
$| = 1;
while (&lt;STDIN&gt;) {
    # ...hier folgen die Umwandlungen und Suchen...
    print $_;
}
</pre>
</example>

          <p>Vorsicht:</p>

          <ol>
            <li>"<em>Keep it simple, stupid</em>'' (KISS), denn ist das
            Programm fehlerhaft, st&uuml;rzt der Apache-Server ab, wenn die 
Regel
            angewendet wird.</li>

            <li>Vermeiden Sie einen weit verbreiteten Fehler: F&uuml;hren Sie 
niemals
            eine gepufferte Ein- und Ausgabe &uuml;ber <code>stdout</code> 
durch,
            weil das zu einer Endlosschleife f&uuml;hren kann. (Daher steht im 
Beispiel
            der Code <code>$|=1</code>...</li>

            <li>Definieren Sie mit der<directive
            module="mod_rewrite">RewriteLock</directive>-Direktive eine
            Sperrdatei, mit der <code>mod_rewrite</code>die Kommunikation
            mit dem Programm synchronisieren kann. Standardm&auml;&szlig;ig
            wird keine Synchronisation durchgef&uuml;hrt.</li>
          </ol>
        </li>
      </ul>
      <p>Die <directive>RewriteMap</directive>-Direktive kann mehrfach
      aufgef&uuml;hrt werden. F&uuml;r jede Mapping-Funktion wird mit einer
      <directive>RewriteMap</directive>-Direktive die Map-Datei deklariert.
      Im Verzeichniskontext kann zwar kein Map <strong>deklariert</strong>
      werden, das Map darf aber in diesem Kontext <strong>verwendet</strong>
      werden. </p>

<note><title>Hinweis</title> Bei einfachen Textdateien und DBM-Dateien
werden die Suchschl&uuml;ssel solange zwischengespeichert, bis sich
der Wert <code>mtime</code> der Map-Datei &auml;ndert oder der Server
neu gestartet wird. Auf diese Weise k&ouml;nnen Regeln Map-Funktionen
enthalten, die f&uuml;r <strong>jede</strong> Anfrage benutzt werden. Das 
stellt kein Problem dar, denn die externe Suche wird nur einmal 
durchgef&uuml;hrt.
</note>

</usage>
</directivesynopsis>

<directivesynopsis>
<name>RewriteBase</name>
<description>Setzt die Basis-URL f&uuml;r den Verzeichniskontext.</description>
<syntax>RewriteBase <em>URL-Pfad</em></syntax>
<default>Informationen hierzu folgen in der Beschreibung.</default>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>FileInfo</override>

<usage>
      <p>Die <directive>RewriteBase</directive>-Direktive setzt explizit
      die Basis-URL f&uuml;r weitere URL-Manipulationen. Wie im Beispiel noch
      deutlich wird, kann
      <directive module="mod_rewrite">RewriteRule</directive>
      in der <code>.htaccess</code>-Datei eines Verzeichnisses
      verwendet werden. Dort wirkt sie lokal, <em>d.h.</em> der lokale
      Verzeichnispr&auml;fix wird in dieser Phase der Verarbeitung abgetrennt
      und die Rewriting-Regeln wirken sich nur auf den verbleibenden Rest aus.
      Am Schluss wird er automatisch wieder hinzugef&uuml;gt. Die
      Standardeinstellung ist <directive>RewriteBase</directive>
      <em> physischer Verzeichnispfad</em>.</p>

      <p>Kommt es zu einer Ersetzung f&uuml;r eine neue URL, muss dieses Modul
      diese URL wieder in die Verarbeitung einbinden. Hierf&uuml;r muss es
      den entsprechenden URL-Pr&auml;fix oder die URL-Basis kennen.
      Standardm&auml;&szlig;ig entspricht dieser Pr&auml;fix dem Dateipfad.
      <strong>Bei den meisten Websites stehen URLs aber NICHT in direkter
      Beziehung zum tats&auml;chlichen Dateipfad, so dass dies normalerweise
      nicht zutrifft.</strong> Daher muss der korrekte URL-Pr&auml;fix mit der
      <code>RewriteBase</code>-Direktive angegeben werden.</p>

<note> Stehen die URLs des Webservers <strong>nicht</strong> in direkter
Beziehung zu tats&auml;chlichen Dateipfaden, dann m&uuml;ssen Sie in jeder
<code>.htaccess</code>-Datei, in der
 <directive module="mod_rewrite">RewriteRule</directive>-Direktiven
 verwendet werden sollen, die <directive>RewriteBase</directive>-Direktive
 benutzen.
</note>

        <p> Ein Beispiel:</p>

<example>
<pre>
#
#  /abc/def/.htaccess -- Konfigurationsdatei f&uuml;r das Verz.  /abc/def
#  Achtung: /abc/def ist der tats&auml;chliche Pfad f&uuml;r /xyz, 
<em>d.h.</em>, der Server
#            erh&auml;lt eine 'Alias /xyz /abc/def'-Direktive
#

RewriteEngine On

#  Dem Server wird mitgeteilt, dass das Ziel &uuml;ber /xyz und nicht
#  &uuml;ber den Pr&auml;fix mit dem tats&auml;chlichen Pfad /abc/def
# erreicht wird.
RewriteBase   /xyz

#  Rewriting-Regeln:
RewriteRule   ^oldstuff\.html$  newstuff.html
</pre>
</example>

        <p>In diesem Beispiel wird ein Anfrage nach
        <code>/xyz/oldstuff.html</code> korrekt f&uuml;r den tats&auml;chlichen 
Pfad zu
        <code>/abc/def/newstuff.html</code> umgeschrieben.</p>

<note><title>F&uuml;r Apache-Hacker</title>
<p>Die folgende Liste f&uuml;hrt die internen Verarbeitungsschritte detailliert 
auf:</p>
<pre>
Anfrage:
  /xyz/oldstuff.html

Interne Verarbeitung:
  /xyz/oldstuff.html     -&gt; /abc/def/oldstuff.html  (per-server Alias)
  /abc/def/oldstuff.html -&gt; /abc/def/newstuff.html  (per-dir    RewriteRule)
  /abc/def/newstuff.html -&gt; /xyz/newstuff.html      (per-dir    RewriteBase)
  /xyz/newstuff.html     -&gt; /abc/def/newstuff.html  (per-server Alias)

Ergebnis:
  /abc/def/newstuff.html
</pre>
<p>Das erscheint sehr kompliziert, entspricht aber der korrekten internen
Verarbeitung des Apache, weil die Manipilation auf Verzeichnisebene
zu sp&auml;t im Prozess erfolgt. Daher muss die (umgeschriebene) Anfrage
wieder in den Apache-Kern zur&uuml;ckgestellt werden. ABER: Auch wenn das Ganze
wie ein &uuml;berm&auml;&szlig;iger Aufwand erscheint, trifft dies dennoch 
nicht zu, da die
R&uuml;ckstellung vollst&auml;ndig intern erfolgt und das gleiche Verfahren von 
vielen
anderen Operationen innerhalb des Servers genutzt wird. Daher sind Design und
Implementierung v&ouml;llig korrekt.</p>
</note>

</usage>

</directivesynopsis>

<directivesynopsis>
<name>RewriteCond</name>
<description>Definiert eine Bedingung, der unter eine Umschreibung stattfindet.
</description>
<syntax> RewriteCond
      <em>TestString</em> <em> BedMuster</em></syntax>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>FileInfo</override>

<usage>
      <p>Die <directive>RewriteCond</directive>-Direktive definiert eine
      Bedingung f&uuml;r eine Regel. Einer <directive
      module="mod_rewrite">RewriteRule</directive>-Direktive werden eine
      oder mehrere <directive>RewriteCond</directive>-Direktiven vorangestellt.
      Die darauf folgende Manipulationregel tritt nur in Kraft, wenn das Muster 
mit
      dem aktuellen Zustand der URL &uuml;bereinstimmt <strong>und</strong>
      wenn diese zus&auml;tzlichen Bedingungen gleichfalls erf&uuml;llt 
sind.</p>

      <p><em>TestString</em> ist eine Zeichenfolge die neben einfachem Text
      folgende Elemente enth&auml;lt:</p>

      <ul>
        <li>
          <strong>RewriteRule-R&uuml;ckverweise</strong>: Dies sind 
R&uuml;ckverweise in der Form:

          <p class="indent">
            <strong><code>$N</code></strong>
          </p>
          (.
        </li>

        <li>
          <strong>RewriteCond-R&uuml;ckverweise</strong>: Dies sind 
R&uuml;ckverweise in der Form:

          <p class="indent">
            <strong><code>%N</code></strong>
          </p>
          (1 &lt;= N &lt;= 9) gew&auml;hrt von der letzten verglichenen
          <code>RewriteCond</code>-Direktive der aktuell verglichenen
          Bedingungen aus Zugriff auf die gruppierten
          Teile des Musters (Klammerausdr&uuml;cke)
        </li>

        <li>
          <strong>RewriteMap-Expansionen</strong>: Dies sind Expansionen der 
Form:

          <p class="indent">
            
<strong><code>${MapName:Schl&uuml;ssel|Voreinstellung}</code></strong>
          </p>
          Unter <a href="#mapfunc"><code>RewriteMap</code></a> finden Sie 
weitere
       Einzelheiten hierzu.
        </li>

        <li>
          <strong>Server-Variablen</strong>: Dies sind Variablen der Form:

          <p class="indent">
            <strong><code>%{</code> <em>NAME_DER_VARIABLEN</em>
            <code>}</code></strong>
          </p>
          Der <em>NAME_DER_VARIABLEN</em> kann eine Zeichenfolge aus
          der nachstehenden Liste sein: 

          <table>
            <tr>
              <th>HTTP-Header:</th> <th>Verbindung &amp; Anfrage:</th> <th></th>
            </tr>

            <tr>
              <td>
                 HTTP_USER_AGENT<br />
                 HTTP_REFERER<br />
                 HTTP_COOKIE<br />
                 HTTP_FORWARDED<br />
                 HTTP_HOST<br />
                 HTTP_PROXY_CONNECTION<br />
                 HTTP_ACCEPT<br />
              </td>

              <td>
                 REMOTE_ADDR<br />
                 REMOTE_HOST<br />
                 REMOTE_USER<br />
                 REMOTE_IDENT<br />
                 REQUEST_METHOD<br />
                 SCRIPT_FILENAME<br />
                 PATH_INFO<br />
                 QUERY_STRING<br />
                 AUTH_TYPE<br />
              </td>
              
              <td></td>
            </tr>

            <tr>
              <th>Server-Interna:</th> <th>System:</th> <th>Speziell:</th>
            </tr>

            <tr>
              <td>
                 DOCUMENT_ROOT<br />
                 SERVER_ADMIN<br />
                 SERVER_NAME<br />
                 SERVER_ADDR<br />
                 SERVER_PORT<br />
                 SERVER_PROTOCOL<br />
                 SERVER_SOFTWARE<br />
              </td>

              <td>
                 TIME_YEAR<br />
                 TIME_MON<br />
                 TIME_DAY<br />
                 TIME_HOUR<br />
                 TIME_MIN<br />
                 TIME_SEC<br />
                 TIME_WDAY<br />
                 TIME<br />
              </td>

              <td>
                 API_VERSION<br />
                 THE_REQUEST<br />
                 REQUEST_URI<br />
                 REQUEST_FILENAME<br />
                 IS_SUBREQ<br />
              </td>
            </tr>
          </table>

<note>
<p>Diese Varaiblen entsprechen alle &auml;hnlich bezeichneten HTTP MIME-Headern,
C-Variablen des Apache-Servers oder <code>struct tm</code>-Feldern des
Unix-Systems. Die meisten von ihnen werden an anderer Stelle oder in der
CGI-Spezifikation beschrieben. Spezielle Variablen  f&uuml;r
<code>mod_rewrite</code> sind:</p>

                <dl>
                  <dt><code>IS_SUBREQ</code></dt>

                  <dd>Enth&auml;lt den Wert <code>true</code>, wenn die gerade
                  verarbeitete Anfrage eine Unteranfrage ist, sonst 
enth&auml;lt sie den Wert
                  <code>false</code>. Unteranfragen k&ouml;nnen von Modulen 
erzeugt
                  werden, die f&uuml;r ihre Aufgaben weitere URLs aufl&ouml;sen 
m&uuml;ssen.</dd>

                  <dt><code>API_VERSION</code></dt>

                  <dd>Die Version der Apache Modul-API (die interne
                  Schnittstelle zwischen Server und Modul) des aktuellen
                  httpd-Build, wie er in <code>include/ap_mmn.h</code> definiert
                  ist. Die API-Version entspricht der verwendeten Apache-Version
                  (f&uuml;r die Apache-Version 1.3.14 ist es beispielsweise 
19990320:10),
                  was jedoch haupts&auml;chlich f&uuml;r Modulentwickler von 
Interesse ist.</dd>

                  <dt><code>THE_REQUEST</code></dt>

                  <dd>Die vollst&auml;ndige Zeile der HTTP-Anfrage, die vom 
Browser an
                  den Server gesendet wird (z.B. <code>GET
                  /index.html HTTP/1.1</code>). Sie enth&auml;lt keine weiteren 
vom
                  Browser gesendeten Header.</dd>

                  <dt><code>REQUEST_URI</code></dt>

                  <dd>Die in der HTTP-Anfragezeile angeforderte Ressource. (Im
                  Beispiel oben w&auml;re das <code>/index.html</code>.)</dd>

                  <dt><code>REQUEST_FILENAME</code></dt>

                  <dd>Der vollst&auml;ndige Pfad zur Datei oder dem Skript im 
lokalen
                  Dateisystem.</dd>
                </dl>
</note>
        </li>
      </ul>

      <p>Spezielle Hinweise:</p>

      <ol>
        <li>Die Variablen SCRIPT_FILENAME und REQUEST_FILENAME
        enthalten den gleichen Wert, n&auml;mlich den Wert des Feldes
        <code>filename</code> der internen 
        <code>request_rec</code>-Struktur des Apache-Servers. Der erste Name
        ist der bekannte CGI-Variablename w&auml;hrend der zweite die 
konsistente
        Entsprechung f&uuml;r REQUEST_URI (mit dem Wert des
        <code>uri</code>-Felds von <code>request_rec</code>) angibt.</li>

        <li>Beim speziellen Format <code>%{ENV:Variable}</code> kann die
        <em>Variable</em> eine beliebige Umgebungsvariable sein. Sie wird in
        internen Apache-Strukturen oder  falls sie dort nicht gefunden wird,
        mit <code>getenv()</code> &uuml;ber den Apache-Serverprozess 
gesucht.</li>

        <li>Beim speziellen Format <code>%{HTTP:header}</code> kann der
        <em>header</em> ein beliebiger HTTP-MIME-Header sein. Er wird in der
        HTTP-Anfrage gesucht. Zum Beispiel:
        <code>%{HTTP:Proxy-Connection}</code> ist der Wert des
        HTTP-Headers <code>Proxy-Connection:</code>.</li>

        <li>Beim speziellen Format <code>%{LA-U:Variable}</code> steht
        <code>LA</code> f&uuml;r "Look-Ahead" und veranlasst (auf URL-Basis) 
eine
        interne Unterabfrage, um den endg&uuml;ltigen Wert der 
<em>Variablen</em>
        zu bestimmen. Es wird verwendet, wenn eine Variable, die erst 
sp&auml;ter in
         einer API-Phase gesetzt wird, f&uuml;r Manipulationen benutzt werden 
soll und
        daher zum aktuellen Zeitpunkt nicht zur Verf&uuml;gung steht. Wenn Sie
        beispielsweise entsprechend der <code>REMOTE_USER</code>-Variablen
        aus dem Serverkontext (<code>httpd.conf</code>-Datei) umschreiben
        m&ouml;chten, dann m&uuml;ssen Sie <code>%{LA-U:REMOTE_USER}</code>
        benutzen, weil diese Variable w&auml;hrend der Authorisierungsphase 
gesetzt wird,
        die <em>nach</em> der URL-Umwandlungsphase folgt, in der
        <code>mod_rewrite</code> operiert. Da <code>mod_rewrite</code>
        aber seinen Verzeichniskontext (<code>.htaccess</code>-Datei) &uuml;ber
        die Fixup-Phase der API implementiert und weil die Authorisierungsphase
        <em>vor</em> dieser Phase liegt, kann hier einfach
        <code>%{REMOTE_USER}</code> benutzt werden.</li>

        <li>Das spezielle Format <code>%{LA-F:Variable}</code> f&uuml;hrt eine
        interne Unterabfrage (auf Basis des Dateinamens) durch, um den
        endg&uuml;ltigen Wert der <em>Variablen</em> zu ermitteln. Meist ist das
        Ergebnis das gleiche wie bei <code>%{LA-U:Variable}</code>.</li>
      </ol>

      <p>Das Bedingungsmuster <em>BedMuster</em> ist ein regul&auml;rer
   Ausdruck, der auf die aktuelle Instanz des <em>TestString</em> angewendet
   wird, <em>d.h.</em> der <em>TestString</em> wird ausgewertet und 
   dann mit <em>BedMuster</em> verglichen.</p>

      <p><strong>Beachten Sie:</strong> <em> BedMuster</em> ist mit
      einigen Erg&auml;nzungen ein
      <em>Perl-kompatibler regul&auml;rer Ausdruck</em>:</p>

      <ol>
        <li>Der Musterzeichenfolge kann ein <code>!</code>-Zeichen
        vorangestellt werden, um ein <em>nicht</em> &uuml;bereinstimmendes
        Muster anzugeben.</li>

        <li>
          F&uuml;r die Bedingungsmuster gibt es einige spezielle Varianten. 
Anstelle
          tats&auml;chlicher regul&auml;rer Ausdr&uuml;cke sind auch folgende
          Formulierungen m&ouml;glich: 

          <ul>
            <li>'<strong>&lt;CondPattern</strong>' ist lexikografisch 
kleiner)<br />
             Behandelt <em>BedMuster</em> wie eine einfache Zeichenfolge
             und vergleicht sie lexikografisch mit <em>TestString</em>. Ist
            <em>TestString</em> lexikografisch kleiner als <em>BedMuster</em>,
            ist die Bedingung erf&uuml;llt.</li>

            <li>'<strong>&gt;CondPattern</strong>' (ist lexikografisch 
gr&ouml;&szlig;er)<br />
             Behandelt <em>BedMuster</em> wie eine einfache Zeichenfolge
             und vergleicht sie lexikografisch mit <em>TestString</em>. Ist
            <em>TestString</em> lexikografisch gr&ouml;&szlig;er als 
<em>BedMuster</em>,
            ist die Bedingung erf&uuml;llt.</li>

            <li>'<strong>=CondPattern</strong>' (ist lexikografisch gleich)<br 
/>
             Behandelt <em>BedMuster</em> wie eine einfache Zeichenfolge
             und vergleicht sie lexikografisch mit <em>TestString</em>. Ist
            <em>TestString</em> lexikografisch gleich <em>BedMuster</em>,
            ist die Bedingung erf&uuml;llt, d.h. die beiden Zeichenfolgen sind 
exakt
            (Zeichen f&uuml;r Zeichen) gleich. Enth&auml;lt <em>BedMuster</em> 
nur zwei
            Anf&uuml;hrungszeichen (<code>""</code>), wird <em>TestString</em>
            mit der leeren Zeichenfolge verglichen.</li>

            <li>'<strong>-d</strong>' (ist ein Verzeichnis: 
            <strong>d</strong>irectory)<br />
             Behandelt <em>TestString</em> als Pfadangabe und pr&uuml;ft, ob es
             vorhanden und ein Verzeichnis ist.</li>

            <li>'<strong>-f</strong>' (ist eine Datei: 
<strong>f</strong>ile)<br />
             Behandelt <em>TestString</em> als Dateiangabe und pr&uuml;ft, ob 
sie
             vorhanden und eine Datei ist.</li>

            <li>'<strong>-s</strong>' (ist eine Datei mit der Gr&ouml;&szlig;e
            <strong>s</strong> f&uuml;r Size)<br />
            Behandelt <em>TestString</em> als Pfadangabe und pr&uuml;ft, ob die
            Datei mit einer Gr&ouml;&szlig;e gr&ouml;&szlig;er als null 
vorhanden ist.</li>

            <li>'<strong>-l</strong>' (ist ein symbolischer 
            <strong>L</strong>ink)<br />
            Behandelt <em>TestString</em> als Pfadangabe und pr&uuml;ft, ob er
            vorhanden und ein symbolischer Link ist.</li>

            <li>'<strong>-F</strong>' (ist eine Datei &uuml;ber 
Unteranfrage)<br />
            Pr&uuml;ft, ob <em>TestString</em> eine g&uuml;ltige Datei ist, die 
&uuml;ber alle
            zur Zeit f&uuml;r den Server konfigurierten Zugriffsberechtigungen 
f&uuml;r
            diesen Pfad zugreifbar ist. Hierf&uuml;r wird eine interne 
Unterabfrage
            verwendet, so dass Vorsicht geboten ist, da der Server hierdurch
            belastet wird.</li>

            <li>'<strong>-U</strong>' (ist eine vorhandene URL &uuml;ber
            Unteranfrage)<br />
            Pr&uuml;ft, ob <em>TestString</em> eine g&uuml;ltige URL ist und ob 
der
            Zugriff &uuml;ber alle zur Zeit f&uuml;r den Server konfigurierten 
Zugriffsrechte
            zug&auml;nglich ist. Hierf&uuml;r wird eine interne Unterabfrage
            verwendet, so dass Vorsicht geboten ist, da der Server hierdurch
            belastet wird.</li>
          </ul>

<note><title>Hinweis</title>
              Bei allen Tests kann ein Ausrufezeichen <code>!</code>
              vorangestellt werden, um die Bedingung zu negieren.
</note>
        </li>
      </ol>

      <p>Dar&uuml;berhinaus k&ouml;nnen f&uuml;r <em>BedMuster</em> 
bestimmte</p>

      <p class="indent">
        <strong><code>[</code><em>Flags</em><code>]</code></strong>
      </p>

      <p>gesetzt werden, die der <code>RewriteCond</code>-Direktive
      als drittes Argument &uuml;bergeben werden. Folgende <em>Flags</em> 
k&ouml;nnen
      mit einer durch Kommata getrennten Liste &uuml;bergeben werden:</p>

      <ul>
        <li>'<strong><code>nocase|NC</code></strong>'
        (<strong>n</strong>o <strong>c</strong>ase)<br />
        Beim Test werden Gro&szlig;- und Kleinschreibung nicht unterschieden,
        <em>d.h.</em> zwischen 'A-Z' und 'a-z' gibt es weder im expandierten
        <em>TestString</em> noch im <em>BedMuster</em> einen
        Unterschied. Dieses Flag hat nur auf die Vergleiche zwischen
        <em>TestString</em> und <em>BedMuster</em> eine Auswirkung, nicht
        jedoch bei &Uuml;berpr&uuml;fungen des Dateisystems und bei 
Unteranfragen.</li>

        <li>
          '<strong><code>ornext|OR</code></strong>'
          (<strong>oder</strong> next condition)<br />
          Kombiniert Regelbedingungen mit einem lokalen ODER anstelle eines
          impliziten UND. Ein typisches Beispiel: 

<example>
<pre>
RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
RewriteCond %{REMOTE_HOST}  ^host3.*
RewriteRule ...speziele Anweisungen f&uuml;r die Hosts...
</pre>
</example>

          Ohne dieses Flag m&uuml;ssten die Anweisungen dreimal geschrieben 
werden.
        </li>
      </ul>

      <p><strong>Beispiel:</strong></p>

       <p>Die Homepage einer Site kann entsprechend dem
        <code>User-Agent:</code>-Header der Anfrage wie folgt umgeschrieben
        werden: </p>

<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>
</example>

        <p>Interpretation: Dient der Netscape Navigator als Browser (der sich
als 'Mozilla' identifiziert), wird die max-Homepage mit Frames, <em>usw.</em>
gesendet. An den Lynx Browser (auf Terminalbasis) wird die min-Homepage
ohne Bilder, Tabellen <em>usw.</em> gesendet. Jeder andere Browser
erh&auml;lt die Standard-Homepage.</p>

</usage>

</directivesynopsis>

<directivesynopsis>
<name>RewriteRule</name>
<description>Definiert Regeln f&uuml;r die Rewriting Engine.</description>
<syntax>RewriteRule
      <em>Muster</em> <em>Substitution</em></syntax>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>FileInfo</override>
<compatibility>Das Cookie-Flag steht seit der Apache-Version 2.0.40
zur Verf&uuml;gung.</compatibility>

<usage>
      <p>Die <directive>RewriteRule</directive>-Direktive spielt die zentrale
      Rolle beim Umschreiben. Wird sie mehrfach aufgef&uuml;hrt, definiert jede
      Direktive eine Manipulationregel. Die <strong>Reihenfolge</strong>
      bei der Definition der Regel ist von Bedeutung, weil sie der Anwendung
      der Regel w&auml;hrend der Ausf&uuml;hrung zugrunde liegt.</p>

      <p><a id="patterns" name="patterns">Das <em>Muster</em></a> ist
      ein Perl-kompatibler <a id="regexp" name="regexp">regul&auml;rer
      Ausdruck</a>, der f&uuml;r die aktuelle URL angewendet wird. "Aktuell" 
bedeutet
      hier die URL zum Zeitpunkt der Regelanwendung. Das muss nicht die
      urspr&uuml;nglich angeforderte URL sein, weil m&ouml;glicherweise bereits 
andere Regeln
      angewendet und Manipulationen vorgenommen wurden.</p>

      <p>Einige Hinweise zur Syntax regul&auml;rer Ausdr&uuml;cke:</p>

<note><pre>
<strong>Text:</strong>
  <strong><code>.</code></strong>           Ein beliebiges einzelnes Zeichen
  <strong><code>[</code></strong>chars<strong><code>]</code></strong>     
Zeichenklasse: Eins aus chars
  <strong><code>[^</code></strong>chars<strong><code>]</code></strong>    
Zeichenklasse: Keins aus chars
  text1<strong><code>|</code></strong>text2 Alternativ: text1 oder text2

<strong>Quantifizerer:</strong>
  <strong><code>?</code></strong>           0 oder 1 aus dem vorhergehenden Text
  <strong><code>*</code></strong>           0 oder N aus dem vorhergehenden 
Text (N &gt; 0)
  <strong><code>+</code></strong>           1 oder N aus dem vorhergehenden 
Text (N &gt; 1)

<strong>Gruppierung:</strong>
  <strong><code>(</code></strong>Text<strong><code>)</code></strong>      
Gruppierung von Text
              (entweder um die Grenzen einer Alternative zu setzen oder
              f&uuml;r R&uuml;ckverweise wobei die <strong>N</strong>te Gruppe 
f&uuml;r den RHS
              einer Manipulationregel <code>$</code><strong>N</strong>
              genutzt werden kann.)

<strong>Anker:</strong>
  <strong><code>^</code></strong>           Start der Ankerlinie
  <strong><code>$</code></strong>           Ende der Ankerlinie

<strong>&Uuml;bergehen:</strong>
  <strong><code>\</code></strong>char       &Uuml;bergehe das Zeichen char
              (zum Beispiel f&uuml;r die Zeichen  "<code>.[]()</code>" 
<em>usw.</em>)
</pre></note>

      <p>Weitere Informationen zu den regul&auml;ren Ausdr&uuml;cken finden Sie 
in der
      ("<a href="http://www.perldoc.com/perl5.6.1/pod/perlre.html";>
      Perl-Dokumentation</a>"). Weitere interessante Details zu regul&auml;ren
      Ausdr&uuml;cken und ihren Varianten (POSIX regex <em>usw.</em>) finden Sie
      unter diesem Thema in folgenden B&uuml;chern:</p>

      <p class="indent">
        <em>Mastering Regular Expressions</em><br />
         Jeffrey E.F. Friedl<br />
         Nutshell Handbook Series<br />
         O'Reilly &amp; Associates, Inc. 1997<br />
         ISBN 1-56592-257-3<br />
      </p>

      <p>In Verbindung mit <code>mod_rewrite</code> darf das NICHT-Zeichen
      (<code>!</code>) als Pr&auml;fix benutzt werden, um ein Muster zu 
negieren.
      Ein Beispiel: "<em>Wenn die aktuelle URL <strong>NICHT</strong> mit
      diesem Muster &uuml;bereinstimmt</em>''. Diese M&ouml;glichkeit kann in
      Ausnahmef&auml;llen gew&auml;hlt werden, wo ein negativer Vergleich 
einfacher ist
      oder f&uuml;r eine abschlie&szlig;ende Standardregel.</p>

<note><title>Hinweis</title>
Bei Verwendung des NICHT-Zeichens f&uuml;r die Negation eines Musters darf
das Muster keine gruppierten Teile mit Jokerzeichen enthalten. Das ist nicht
zul&auml;ssig, denn trifft das Muster NICHT zu, dann haben die Gruppen keine
Inhalte. Dementsprechend kann bei Verwendung negierter Muster auch nicht
<code>$N</code> in der Ersetzungszeichenfolge stehen.
</note>

      <p><a id="rhs" name="rhs"><em>Substitution</em></a> ist die
      Zeichenfolge, die f&uuml;r die urspr&uuml;ngliche URL eingesetzt wird, 
f&uuml;r die
      das <em>Muster</em> &uuml;bereinstimmt. Neben einfachem Text sind
      folgende Angaben m&ouml;glich:</p>

      <ol>
        <li>R&uuml;ckverweise <code>$N</code> auf das <code>RewriteRule
        </code>-Muster</li>

        <li>R&uuml;ckverweise <code>%N</code> auf das letzte verglichene
        <code>RewriteCond</code>-Muster</li>

        <li>Server-Variablen wie Zeichenfolgen f&uuml;r Regelbedingungen
        (<code>%{VARNAME}</code>)</li>

        <li><a href="#mapfunc">Mapping-Funktion</a>saufrufe
        (<code>${mapname:key|default}</code>)</li>
      </ol>
      <p>R&uuml;ckverweise sind <code>$</code><strong>N</strong>
      (<strong>N</strong>=0..9)-Bezeichner, die durch den Inhalt der
      <strong>N</strong>-ten Gruppe des verglichenen <em>Musters</em> 
      ersetzt werden. Die Server-Variablen sind die gleichen wie f&uuml;r den
      <em>TestString</em> einer <code>RewriteCond</code>-Direktive.
      Die Mapping-Funktionen stammen von der
      <code>RewriteMap</code>-Direktive und werden dort erkl&auml;rt.
      Diese drei Arten von Variablen werden in der oben aufgef&uuml;hrten
      Reihenfolge expandiert. </p>

      <p>Wie bereits erw&auml;hnt wurde, werden alle Manipulationregeln
      f&uuml;r die <em>Substitution</em> angewendet (in der Reihenfolge
      ihrer Definition in der Konfigurationdatei). Die URL wird
      <strong>vollst&auml;ndig</strong> durch die <em>Substitution</em>
      ersetzt und die Manipulationen werden fortgesetzt, bis keine Regeln
      mehr anzuwenden sind, es sei denn, sie werden explizit durch ein
      <code><strong>L</strong></code>-Flag beendet (siehe unten).</p>

      <p>Das spezielle Substitutionelement <code>-</code> bedeutet, dass
      <strong>KEINE Substitution</strong> erfolgt. Das mag seltsam erscheinen,
      ist aber sinnvoll, um Manipulationsregeln bereitstellen zu k&ouml;nnen, 
die URLs
      <strong>nur</strong> vergleichen, ohne eine Ersetzung vorzunehmen.
      Das bedeutet, dass in Verbindung mit dem <strong>C</strong>-Flag
      mehr als nur ein Muster vor der Ersetzung angewendet werden kann.</p>

      <p>Es ist sogar m&ouml;glich, URLs in der Ersetzungszeichenfolge zu
      erzeugen, die einen Abfrageteil enthalten. Ein Fragezeichen in der
      Ersetzungszeichenfolge zeigt an, dass das, was folgt, in den
      QUERY_STRING eingef&uuml;gt werden soll. Soll eine vorhandene
      Abfragezeichenfolge entfernt werden, wird die Ersetzungszeichenfolge
      einfach mit einem Fragezeichen beendet.</p>

<note><title>Hinweis</title>
Es gibt eine Besonderheit: Wenn ein Substitutionsfeld den Pr&auml;fix
<code>http://</code><em>DieserHost</em>[<em>:DieserPort</em>]
erh&auml;lt, schneidet <strong>mod_rewrite</strong> ihn automatisch ab.
Diese automatische Verk&uuml;rzung bei impliziten externen Umleitungen ist eine
n&uuml;tzliche und wichtige M&ouml;glichkeit, wenn sie in Verbindung mit einer
Mapping-Funktion eingesetzt wird, die den Hostnamen generiert. Beachten Sie
hierzu das erste der weiter unten folgenden Beispiel.
</note>

<note><title>Hinweis</title>
 Eine bedingungslose externe Umleitung zum eigenen Server funktioniert mit dem 
 Pr&auml;fix <code>http://DieserHost</code> nicht. Eine solche Selbstumleitung 
kann
 mit dem Flag <strong>R</strong> erreicht werden (siehe unten).
</note>

      <p>Weitere spezielle Substitutionsanweisungen k&ouml;nnen mit</p>

      <p class="indent">
        <strong><code>[</code><em>Flags</em><code>]</code></strong>
      </p>
      <p>
      als drittem Argument an die <code>RewriteRule</code>-Direktive 
angeh&auml;ngt
      werden. Mit einer durch Kommata getrennten Liste k&ouml;nnen folgende
      <em>Flags</em> angegeben werden: </p>

      <ul>
        <li>
          '<strong><code>redirect|R</code>
[=<em>Code</em>]</strong>' (verlangt eine Umleitung)<br />
Das Feld <em>Substitution</em> erh&auml;lt den Pr&auml;fix
<code>http://DieserHost[:DieserPort]/</code> (was die neue URL zur
URI macht), um eine externe Umleitung zu erzwingen. Wird kein
<em>Code</em> angegeben, wird die HTTP-Antwort <code>302 (MOVED
TEMPORARILY)</code> gesendet. Sollen andere Codes aus dem Bereich
300-400 gesendet werden, wird einfach deren Nummer oder einer der
folgenden symbolischen Namen angegeben:<code>temp</code>
(Standardeinstellung), <code>permanent</code> oder <code>seeother</code>.
Verwenden Sie diese M&ouml;glichkeit f&uuml;r permanente URL-Umleitungen, bei 
denen
<code>/~</code> in <code>/u/</code> umgewandelt oder immer ein
Schr&auml;gstrich an <code>/u/</code><em>user</em> usw. angeh&auml;ngt wird.<br 
/>
           

<p><strong>Achtung:</strong> Wenn dieses Flag verwendet wird, muss das
Substitutionsfeld eine g&uuml;ltige URL entalten. Ist dies nicht der Fall, wird 
an eine
unzul&auml;ssige Position umgeleitet. Ferner ist zu beachten, dass dieses Flag 
selbst
die URL nur mit dem Pr&auml;fix <code>http://DieserHost[:DieserPort]/</code>
versieht, die Manipulation aber fortgesetzt wird. Normalerweise soll abgebrochen
und die Umleitung unmittelbar erfolgen. Damit die URL-Manipulation ebenfalls
abgebrochen wird, muss das Flag <code>L</code> angegeben werden.</p>
        </li>

        <li>'<strong><code>forbidden|F</code></strong>' (die URL
        wird verboten)<br />
Die aktuelle URL wird verboten, <em>d.h.</em> es wird sofort die HTTP-Antwort
<code>403 (FORBIDDEN)</code>gesendet. Dieses Flag kann in Verbindung
mit entsprechenden <code>RewriteCond</code>-Bedingungen URLs
blockieren.</li>

        <li>'<strong><code>gone|G</code></strong>' (URL gel&ouml;scht)<br />
Die aktuelle URL wird als gel&ouml;scht gekennzeichnet, <em>d.h.</em> es wird 
sofort
die HTTP-Antwort <code>410 (GONE)</code> gesendet. Mit diesem Flag
werden Seiten gekennzeichnet, die nicht mehr vorhanden sind.</li>

        <li>
          '<strong><code>proxy|P</code></strong>' (Proxy-Anfrage erzwingen)
          <br />
Dieses Flag erzwingt, dass der Substitutionsteil intern zur Proxy-Anfrage wird
und sofort vom <a href="mod_proxy.html">Proxy-Modul</a> verarbeitet
wird (die URL-Manipulation wird an dieser Stelle abgebrochen). Es muss
sichergestellt werden, dass die Substitutionszeichenfolge eine g&uuml;ltige URI
enth&auml;lt (die normalerweise mit <code>http://</code><em>Hostname</em>
beginnt), die vom Proxy-Modul verarbeitet werden kann. Ist dies nicht der Fall,
kann das Proxy-Modul einen Fehler melden. Dieses Flag erm&ouml;glicht eine
leistungsf&auml;higere Implementierung der <a href="mod_proxy.html#proxypass">
ProxyPass</a>-Direktive f&uuml;r das Einblenden von Daten anderer Websrever
in den lokalen Server. 

<p>Hinweis: Um diese Funktionalit&auml;t nutzen zu k&ouml;nnen, muss das 
Proxy-Modul
beim Kompilieren in den Apache-Server mit eingebunden werden. Falls Sie nicht
wissen, ob das der Fall ist, &uuml;berpr&uuml;fen Sie, ob 
<code>mod_proxy.c</code>
in der Ausgabe von <code>httpd -l</code> erscheint. Trifft dies zu, steht die 
Funktionalit&auml;t f&uuml;r <code>mod_rewrite</code> zur Verf&uuml;gung.  
Andernfalls 
m&uuml;ssen Sie das Modul in das Hauptprogramm <code>httpd</code>
einbinden.</p>
        </li>

        <li>'<strong><code>last|L</code></strong>'
        (Letzte Regel)<br />
Stoppt die URL-Manipulation an dieser Stelle, weiteren Regeln werden nicht mehr
angewendet. Dieses Flag entspricht dem Perl-Befehl <code>last</code> oder
dem <code>break</code>-Befehl der Programmiersprache C. Mit diesem Flag kann 
verhindert werden, dass die gereade umgeschriebene URL von
nachfolgenden Regeln &uuml;berschrieben wird. Auf diese Weise kann zum Beispiel
die Root-URL <code>/</code> in die richtige URL <code>/e/www/</code>
umgeschrieben werden.
          </li>

        <li>'<strong><code>next|N</code></strong>'
        (N&auml;chster Durchgang)<br />
Der Manipulationsvorgang wird noch einmal wiederholt (beginnend mit der ersten
Regel). Die zu vergleichende URL ist nicht die urspr&uuml;ngliche URL sondern 
die
nach der letzten Manipulation. Dies entspricht dem Perl-Befehl
 <code>next</code> oder dem C-Befehl <code>continue</code>. Mit diesem
 Flag wird der Manipulationsprozess erneut gestartet und sofort an den 
Ausgangspunkt zur&uuml;ckgekehrt.<br />
         <strong>Achten Sie darauf, Endlosschleifen zu vermeiden!</strong>
        </li>

        <li>'<strong><code>chain|C</code></strong>'
        (Verkettung mit der n&auml;chsten Regel)<br />
Mit diesem Flag wird die aktuelle mit der folgenden Regel verkettet (die
ihrerseits wieder mit der n&auml;chsten Regel verkettet sein kann usw.). Das hat
folgende Auswirkung: Trifft eine Regel zu, wird die Verarbeitung normal
fortgesetzt (das Flag hat keine Auswirkungen). Trifft die Regel
<strong>nicht</strong> zu, werden alle verketteten Regeln ausgelassen. So
kann beispielsweise der <code>.www</code>-Teil aus einem Regelsatz f&uuml;r die
Verzeichnisebene entfernt werden, wenn eine externe Umleitung durchgef&uuml;hrt 
wird,
bei der der <code>.www</code>-Teil nicht vorhanden sein sollte.
       </li>

        <li>
        '<strong><code>type|T</code></strong>=<em>MIME-Typ</em>'
        (MIME- <strong>T</strong>yp)<br />
Erzwingt den MIME-Typ der Zieldatei. Hiermit kann beispielsweise die
<code>mod_alias</code>-Direktive <code>ScriptAlias</code>
simuliert werden, die intern erzwingt, dass alle Dateien im zugeordneten
Verzeichnis den MIME-Typ <code>application/x-httpd-cgi</code> haben.</li>

        <li>
          '<strong><code>nosubreq|NS</code></strong>' (Wird nur benutzt,
          wenn keine interne Unteranfrage vorliegt)<br />
Dieses Flag veranlasst die Rewriting Engine eine Regel zu &uuml;berspringen, 
wenn
es sich bei der aktuellen Anfrage um eine interne Unteranfrage handelt. Zu
internen Unteranfragen kommt es beim Apache beispielsweise, wenn
<code>mod_include</code> Informationen &uuml;ber m&ouml;gliche
Standardverzeichnisdateien sucht (<code>index.xxx</code>). Bei Unterabfragen 
ist es nicht immer sinnvoll und f&uuml;hrt manchmal sogar zu Fehlern, wenn der
vollst&auml;ndige Regelsatz angewendet wird. Mit diesem Flag k&ouml;nnen 
bestimmte Regeln ausgeschlossen werden.<br />
           

          <p>Folgende Regel sollte ber&uuml;cksichtigt werden: Immer wenn URLs
ein CGI-Skripte als Pr&auml;fix erhalten, damit sie von diesem verarbeitet 
werden,
ist die Wahrscheinlichkeit gro&szlig;, dass es zu Problemen (oder zu Overhead)
bei Unteranfragen kommt. In diesen F&auml;llen sollte dieses Flag benutzt 
werden.</p>
        </li>

        <li>'<strong><code>nocase|NC</code></strong>'
        (Keine Unterscheidung von Gro&szlig;- und Kleinschreibung)<br />
Beim <em>Muster</em> werden Gro&szlig;- und Kleinschreibung nicht unterschieden,
so dass es beim Vergleich der aktuellen URL mit dem <em>Muster</em>
keinen Unterschied zwischen 'A-Z' und 'a-z' gibt.
        </li>

        <li>'<strong><code>qsappend|QSA</code></strong>'
        (Eine Abfragezeichenfolge anh&auml;ngen)<br />
Dieses Flag zwingt die Rewriting Engine eine Abfragezeichenfolge an die
in der Substitutionszeichenfolge vorhandene anzuh&auml;ngen, anstatt sie zu 
ersetzen.
Damit k&ouml;nnen &uuml;ber eine Manipulationsregel der Abfragezeichenfolge 
mehr Daten
hinzugef&uuml;gt werden.</li>

        <li>
          '<strong><code>noescape|NE</code></strong>'
          (Sonderzeichen werden nicht in URL-Escape-Werte umgewandelt)<br />
Dieses Flag verhindert, dass <code>mod_rewrite</code> die &uuml;blichen
Umwandlungen nach den URI_Escape-Regeln durchf&uuml;hrt. Normalerweise werden
Sonderzeichen wie <code>%</code>, <code>$</code>, <code>,</code> usw. in ihre 
hexadezimalen &Auml;quivalente umgewandelt (<code>%25</code>, <code>
524</code> und <code>%3B</code>), was dieses Flag verhindert. Das
erm&ouml;glicht, dass Prozentzeichen in der Ausgabe erscheinen k&ouml;nnen:
<example>
    RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
</example>
<code>/foo/zed</code> wird in eine sicher Anfrage nach
<code>/bar?arg=P1=zed</code> umgewandelt. 
        </li>

        <li>
          '<strong><code>passthrough|PT</code></strong>'
          (Das Ergebnis wird an ein anderes Modul weitergereicht.)<br />
Dieses Flag veranlasst die Rewriting Engine das <code>uri</code>-Feld der
internen <code>request_rec</code>-Struktur auf den Wert des Feldes
<code>filename</code> zu setzen. Dieses Flag bietet die M&ouml;glichkeit
die Ausgabe von <code>RewriteRule</code>-Direktiven von den Direktiven
<code>Alias</code>, <code>ScriptAlias</code>, <code>Redirect</code>
usw. anderer URI-/Dateiname-Umwandlungen nachbearbeiten zu lassen. Das
folgende einfache Beispiel soll die Semantik veranschaulichen. <code>/abc</code>
soll mit Hilfe der Rewriting Engine von <code>mod_rewrite
</code> zu <code>/def</code> und anschlie&szlig;end
<code>/def</code> mit<code>mod_alias</code> in <code>/ghi</code> umgeschrieben 
werden: 
<example>
    RewriteRule ^/abc(.*)  /def$1 [PT]<br />
    Alias       /def       /ghi
</example>
Wird das Flag <code>PT</code> weggelassen, &uuml;berschreibt
<code>mod_rewrite</code> wie erwartet <code>uri=/abc/...</code> mit
<code>Dateiname=/def/...</code>, wie dies bei einer API-konformen
Umwandlung von URI in Dateiname der Fall sein soll. Versucht anschlie&szlig;end 
<code>mod_alias</code> eine Umwandlung von URI in einen Dateinamen,
dann funktioniert das nicht mehr. 

          <p>Hinweis: <strong>Dieses Flag muss verwendet werden, wenn
Direktiven unterschiedlicher Module mit Umwandlungen von URL in Dateinamen
vermischt werden sollen</strong>. Ein typisches Beispiel ist die Verwendung
von <code>mod_alias</code> und <code>mod_rewrite</code>.</p>
        </li>

        <li>'<strong><code>skip|S</code></strong>=<em>num</em>'
        (N&auml;chste Regel(n) auslassen)<br />
Bei Angabe dieses Flag &uuml;berspringt die Rewriting Engine die n&auml;chsten
<em>num</em> Regeln der Sequenz, wenn die aktuelle Regel zutrifft. Das
erm&ouml;glicht ein Pseudokonstrukt der <code>if/then/else</code>-Bedingung:
Die letzte Regel der <code>then</code>-Klausel lautet <code>skip=N</code>,
wobei <code>num</code> der Anzahl der Regeln in der
<code>else</code>-Klausel entspricht. (Das ist <strong>nicht</strong> das
Gleiche wie das <code>chain|C</code>-Flag!)</li>

        <li>
'<strong><code>env|E=</code></strong><em>VAR</em>:<em>WERT</em>'
(Setzt eine Umgebungsvariable)<br />
Die Umgebungsvariable <em>VAR</em> wird auf einen <em>WERT</em>
gesetzt, wobei der <em>WERT</em> die R&uuml;ckverweise <code>$N</code>
und <code>%N</code> enthalten kann, die expandiert werden. Dieses Flag
kann mehrmals verwendet werden, um mehrere Variablen zu setzen. Die
Variablen k&ouml;nnen sp&auml;ter in vielen Situationen dereferenziert werden, 
was aber
normalerweise in XSSI (&uuml;ber <code>&lt;!--#echo var="VAR"--&gt;</code>)
oder CGI (<code>$ENV{'VAR'}</code>) geschieht. Ferner kann die
Dereferenzierung in einem folgenden <code>RewriteCond</code>-Muster
mit <code>%{ENV:VAR}</code> erfolgen. Auf diese Weise werden Informationen aus 
URLs gestrichen, ohne sie zu l&ouml;schen.</li>

        <li>
                
'<strong><code>cookie|CO=</code></strong><em>NAME</em>:<em>WERT</em>:<em>Dom&auml;ne</em>[:<em>Lebensdauer</em>[:<em>Pfad</em>]]'
(Setzt ein Cookie)<br />
Mit diesem Flag wird ein Cookie f&uuml;r den Client-Browser gesetzt.
<em>NAME</em> gibt den Cookie-Namen und <em>WERT</em> seinen
Wert an. Das Feld <em>Dom&auml;ne</em> gibt die Dom&auml;ne des Cookie an, zum
Beispiel <code>apache.org</code>. Optional kann die <em>Lebennsdauer</em>
des Cookie in Minuten und der <em>Pfad</em> angegeben werden.</li>
 
      </ul>

<note><title>Hinweis</title> Beachten Sie, dass das <em>Muster</em> in
einer Serverkonfigurationsdatei f&uuml;r die vollst&auml;ndige URL angewendet 
wird.
<strong>In einer Verzeichnis-Konfigurationsdateien wird der 
Verzeichnispr&auml;fix
f&uuml;r das &uuml;bereinstimmende Muster (der f&uuml;r ein bestimmtes 
Verzeichnis immer
der gleiche ist!) automatisch <em>entfernt</em> und nach der Substitution 
automatisch <em>hinzugef&uuml;gt</em>.</strong> Diese M&ouml;glichkeit ist 
f&uuml;r viele
Formen der Ersetzung unerl&auml;sslich, denn ohne diese Pr&auml;fixentfernung 
m&uuml;sste
das &uuml;bergeordnete Verzeichnis verglichen werden, was nicht immer 
m&ouml;glich ist.

<p>Eine Ausnahme muss beachtet werden: Wenn eine Substitutionszeichenfolge
mit <code>http://</code> beginnt, wird der Verzeichnispr&auml;fix
<strong>nicht</strong> hinzugef&uuml;gt sondern eine externe Umleitung oder eine
Proxy-Anfrage erzwungen (wenn das Flag <strong>P</strong> benutzt
wird)!</p>
</note>

<note><title>Hinweis</title>
 Um die Rewriting Enginef&uuml;r Verzeichnis-Konfigurationsdateien zu 
aktivieren,
 muss <code>RewriteEngine</code> in diesen Dateien auf
 <code>On</code> gesetzt <strong>und</strong> <code>Options
  FollowSymLinks</code> aktiviert werden. Hat der Administrator das
  &Uuml;berschreiben von <code>FollowSymLinks</code> f&uuml;r ein 
Benutzerverzeichnis
  deaktiviert, dann kann die Rewriting Engine nicht benutzt werden. Diese
  Einschr&auml;nkung ist aus Sicherheitsgr&uuml;nden erforderlich.
</note>

      <p>Im folgenden werden alle m&ouml;glichen Substitutionskombinationen und
      ihre Bedeutungen aufgef&uuml;hrt:</p>

      <p><strong>Innerhalb der Serverkonfiguration
      (<code>httpd.conf</code>)<br />
       f&uuml;r die Anfrage <code>GET /EinPfad/Pfadinfo</code>':</strong><br />
      </p>

<note><pre>
<strong>Regel</strong>                           <strong>Ersetzung</strong>
----------------------------------------------  
----------------------------------
^/EinPfad(.*) AndererPfad$1                      nicht unterst&uuml;tzt, da 
ung&uuml;ltig!

^/EinPfad(.*) AndererPfad$1  [R]               nicht unterst&uuml;tzt, da 
ung&uuml;ltig!

^/EinPfad(.*) AndererPfad$1  [P]                nicht unterst&uuml;tzt, da 
ung&uuml;ltig!
----------------------------------------------  
----------------------------------
^/EinPfad(.*) /AndererPfad$1                     /AndererPfad/Pfadinfo

^/EinPfad(.*) /AndererPfad$1 [R]                 
http://DieserHost/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung

^/EinPfad(.*) /AndererPfad$1 [P]                 nicht unterst&uuml;tzt, da 
unsinnig!
----------------------------------------------  
----------------------------------
^/EinPfad(.*) http://DieserHost/AndererPfad$1      /AndererPfad/Pfadinfo

^/EinPfad(.*) http://DieserHost/AndererPfad$1 [R]  
http://DieserHost/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung

^/EinPfad(.*) http://DieserHost/AndererPfad$1 [P]  nicht unterst&uuml;tzt, da 
unsinnig!
----------------------------------------------  
----------------------------------
^/EinPfad(.*) http://AndererHost/AndererPfad$1     
http://AndererHost/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung

^/EinPfad(.*) http://AndererHost/AndererPfad$1 [R] 
http://AndererHost/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung
                                                (das [R]-Flag ist redundant)

^/EinPfad(.*) http://AndererHost/AndererPfad$1 [P] 
http://AndererHost/AndererPfad/Pfadinfo
                                                &uuml;ber internen Proxy
</pre></note>

      <p><strong>In der Verzeichniskonfiguration
      <code>/EinPfad</code><br />
       (<em>d.h.</em>, die Datei <code>.htaccess</code> in
      <code>/physischer/Pfad/zu/EinPfad</code> mit
      <code>RewriteBase /EinPfad</code>)<br />
       f&uuml;r <code>GET
      /EinPfad/LokalerPfad/Pfadinfo</code>':</strong><br /> 
     </p>

<note><pre>
<strong>Regel</strong>                                      
<strong>Ersetzung</strong>
----------------------------------------------  
----------------------------------
^LokalerPfad(.*) AndererPfad$1                      
/EinPfad/AndererPfad/Pfadinfo

^LokalerPfad(.*) AndererPfad$1  [R]                 
http://DieserHost/EinPfad/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung

^LokalerPfad(.*) AndererPfad$1  [P]                 nicht unterst&uuml;tzt, da 
unsinnig!
----------------------------------------------  
----------------------------------
^LokalerPfad(.*) /AndererPfad$1                     /AndererPfad/Pfadinfo

^LokalerPfad(.*) /AndererPfad$1 [R]                 
http://DieserHost/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung

^LokalerPfad(.*) /AndererPfad$1 [P]                 nicht unterst&uuml;tzt, da 
unsinnig!
----------------------------------------------  
----------------------------------
^LokalerPfad(.*) http://DieserHost/AndererPfad$1      /AndererPfad/Pfadinfo

^LokalerPfad(.*) http://DieserHost/AndererPfad$1 [R]  
http://DieserHost/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung

^LokalerPfad(.*) http://DieserHost/AndererPfad$1 [P]  nicht unterst&uuml;tzt, 
da unsinnig!
----------------------------------------------  
----------------------------------
^LokalerPfad(.*) http://AndererHost/AndererPfad$1     
http://AndererHost/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung

^LokalerPfad(.*) http://AndererHost/AndererPfad$1 [R] 
http://AndererHost/AndererPfad/Pfadinfo
                                                &uuml;ber externe Umleitung
                                                (the [R] flag is redundant)

^LokalerPfad(.*) http://AndererHost/AndererPfad$1 [P] 
http://AndererHost/AndererPfad/Pfadinfo
                                                &uuml;ber internen Proxy
</pre></note>

      <p><strong>Beispiel:</strong></p>

      <p>URLs der Form </p>

        <p class="indent">
          <code>/</code> <em>Language</em> <code>/~</code>
          <em>Realname</em> <code>/.../</code> <em>File</em>
        </p>

        <p>sollen wie folgt umgeschrieben werden:</p>

        <p class="indent">
          <code>/u/</code> <em>Username</em> <code>/.../</code>
          <em>File</em> <code>.</code> <em>Language</em>
        </p>

        <p>Die obige Rewrite-Map-Datei wird unter
        <code>/Pfad/zu/Datei/map.txt</code> gespeichert. Der
        Serverkonfiguration m&uuml;ssen lediglich folgende Zeilen 
hinzugef&uuml;gt werden:</p>

<example>
<pre>
RewriteLog   /Pfad/zu/Datei/rewrite.log
RewriteMap   real-to-user               txt:/Pfad/zu/Datei/map.txt
RewriteRule  ^/([^/]+)/~([^/]+)/(.*)$   /u/${real-to-user:$2|nobody}/$3.$1
</pre>
   </example>
  </usage>
 </directivesynopsis>
</modulesynopsis>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to