| <?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: 1933438:1935430 (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="tech.xml.meta"> |
| <parentdocument href="./">Rewrite</parentdocument> |
| |
| <title>Technische Details zu Apache mod_rewrite</title> |
| |
| <summary> |
| <p>Dieses Dokument behandelt einige der technischen Details von |
| <module>mod_rewrite</module> und der URL-Zuordnung.</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="InternalAPI"><title>API-Phasen</title> |
| |
| <p>Der Apache HTTP Server bearbeitet Anfragen in mehreren Phasen. |
| In jeder dieser Phasen können ein oder mehrere Module aufgerufen |
| werden, um diesen Teil des Anfrage-Lebenszyklus zu behandeln. Zu |
| den Phasen gehören Dinge wie URL-zu-Dateiname-Übersetzung, |
| Authentifizierung, Autorisierung, Inhalt und Protokollierung. (Dies |
| ist keine vollständige Liste.)</p> |
| |
| <p><module>mod_rewrite</module> wirkt in zwei dieser Phasen (oder "Hooks", wie |
| sie oft genannt werden), um zu beeinflussen, wie URLs umgeschrieben |
| werden können.</p> |
| |
| <p>Erstens verwendet es den URL-zu-Dateiname-Übersetzungs-Hook, der |
| nach dem Lesen der HTTP-Anfrage stattfindet, aber bevor eine |
| Autorisierung beginnt. Zweitens verwendet es den Fixup-Hook, der |
| nach den Autorisierungsphasen und nach dem Lesen der |
| verzeichnisbezogenen Konfigurationsdateien |
| (<code>.htaccess</code>-Dateien) stattfindet, aber bevor der |
| Inhalts-Handler aufgerufen wird.</p> |
| |
| <p>Nachdem eine Anfrage eingegangen ist und ein entsprechender Server |
| oder virtueller Host bestimmt wurde, beginnt die Umschreibungs-Engine |
| mit der Verarbeitung aller <module>mod_rewrite</module>-Direktiven in der |
| Server-Konfiguration. (d.h. in der Hauptserverkonfigurationsdatei und |
| in <directive module="core" type="section">Virtualhost</directive>-Abschnitten.) |
| Dies geschieht in der URL-zu-Dateiname-Phase.</p> |
| |
| <p>Einige Schritte später, nachdem die endgültigen Datenverzeichnisse |
| gefunden wurden, werden die verzeichnisbezogenen |
| Konfigurationsdirektiven (<code>.htaccess</code>-Dateien und |
| <directive module="core" type="section">Directory</directive>-Blöcke) |
| angewendet. Dies geschieht in der Fixup-Phase.</p> |
| |
| <p>In jedem dieser Fälle schreibt <module>mod_rewrite</module> die |
| <code>REQUEST_URI</code> entweder auf eine neue URL oder auf einen |
| Dateinamen um.</p> |
| |
| <p>Im Verzeichniskontext (d.h. in <code>.htaccess</code>-Dateien und |
| <code>Directory</code>-Blöcken) werden diese Regeln angewendet, |
| nachdem eine URL bereits in einen Dateinamen übersetzt wurde. Aus |
| diesem Grund ist der URL-Pfad, gegen den <module>mod_rewrite</module> |
| zunächst die <directive module="mod_rewrite">RewriteRule</directive>-Direktiven |
| abgleicht, der vollständige Dateisystempfad zum übersetzten |
| Dateinamen, wobei der Pfad des aktuellen Verzeichnisses (einschließlich |
| eines abschließenden Schrägstrichs) vom Anfang entfernt wurde.</p> |
| |
| <p>Zur Veranschaulichung: Wenn Regeln in /var/www/foo/.htaccess stehen |
| und eine Anfrage für /foo/bar/baz verarbeitet wird, würde ein Ausdruck |
| wie ^bar/baz$ übereinstimmen.</p> |
| |
| <p>Wenn eine Ersetzung im Verzeichniskontext vorgenommen wird, wird |
| eine neue interne Unteranfrage mit der neuen URL ausgelöst, die die |
| Verarbeitung der Anfragephasen neu startet. Wenn die Ersetzung ein |
| relativer Pfad ist, bestimmt die |
| <directive module="mod_rewrite">RewriteBase</directive>-Direktive |
| das URL-Pfad-Präfix, das der Ersetzung vorangestellt wird. Im |
| Verzeichniskontext muss darauf geachtet werden, Regeln zu erstellen, |
| die letztendlich (in einer zukünftigen "Runde" der verzeichnisbezogenen |
| Umschreibungsverarbeitung) keine Ersetzung durchführen, um Schleifen |
| zu vermeiden. (Siehe <a |
| href="https://cwiki.apache.org/confluence/display/httpd/RewriteLooping">RewriteLooping</a> |
| für eine weitere Diskussion dieses Problems.)</p> |
| |
| <p>Aufgrund dieser weiteren Manipulation der URL im Verzeichniskontext |
| müssen Sie Ihre Umschreibungsregeln in diesem Kontext anders |
| gestalten. Insbesondere denken Sie daran, dass der führende |
| Verzeichnispfad vom URL-Pfad abgeschnitten wird, den Ihre |
| Umschreibungsregeln sehen. Betrachten Sie die folgenden Beispiele |
| zur weiteren Verdeutlichung.</p> |
| |
| <table border="1"> |
| |
| <tr> |
| <th>Ort der Regel</th> |
| <th>Regel</th> |
| </tr> |
| |
| <tr> |
| <td>VirtualHost-Abschnitt</td> |
| <td>RewriteRule "^/images/(.+)\.jpg" "/images/$1.gif"</td> |
| </tr> |
| |
| <tr> |
| <td>.htaccess-Datei im Document Root</td> |
| <td>RewriteRule "^images/(.+)\.jpg" "images/$1.gif"</td> |
| </tr> |
| |
| <tr> |
| <td>.htaccess-Datei im images-Verzeichnis</td> |
| <td>RewriteRule "^(.+)\.jpg" "$1.gif"</td> |
| </tr> |
| |
| </table> |
| |
| <p>Für noch mehr Einblick, wie <module>mod_rewrite</module> URLs in |
| verschiedenen Kontexten manipuliert, sollten Sie die |
| <a href="../mod/mod_rewrite.html#logging">Protokolleinträge</a> |
| konsultieren, die während der Umschreibung erstellt werden.</p> |
| |
| </section> |
| |
| <section id="InternalRuleset"><title>Regelsatz-Verarbeitung</title> |
| |
| <p>Wenn <module>mod_rewrite</module> in diesen beiden API-Phasen |
| ausgelöst wird, liest es die konfigurierten Regelsätze aus seiner |
| Konfigurationsstruktur (die entweder beim Start für den |
| Server-Kontext oder während des Verzeichnisdurchlaufs des |
| Apache-Kerns für den Verzeichniskontext erstellt wurde). Dann wird |
| die URL-Umschreibungs-Engine mit dem enthaltenen Regelsatz gestartet |
| (eine oder mehrere Regeln zusammen mit ihren Bedingungen). Die |
| Funktionsweise der URL-Umschreibungs-Engine ist für beide |
| Konfigurationskontexte genau gleich. Nur die endgültige |
| Ergebnisverarbeitung ist unterschiedlich.</p> |
| |
| <p>Die Reihenfolge der Regeln im Regelsatz ist wichtig, da die |
| Umschreibungs-Engine sie in einer speziellen (und nicht sehr |
| offensichtlichen) Reihenfolge verarbeitet. Die Regel lautet: |
| Die Umschreibungs-Engine durchläuft den Regelsatz Regel für Regel |
| (<directive module="mod_rewrite">RewriteRule</directive>-Direktiven) |
| und wenn eine bestimmte Regel übereinstimmt, durchläuft sie optional |
| die vorhandenen zugehörigen Bedingungen (<code>RewriteCond</code>-Direktiven). |
| Aus historischen Gründen werden die Bedingungen zuerst angegeben, |
| sodass der Kontrollfluss etwas umständlich ist. Siehe Abbildung 1 |
| für weitere Details.</p> |
| <p class="figure"> |
| <img src="../images/rewrite_process_uri.png" |
| alt="Ablauf der RewriteRule- und RewriteCond-Zuordnung" /><br /> |
| <dfn>Abbildung 1:</dfn>Der Kontrollfluss durch den Umschreibungsregelsatz |
| </p> |
| <p>Zuerst wird die URL gegen das <em>Pattern</em> jeder Regel |
| abgeglichen. Wenn es fehlschlägt, stoppt <module>mod_rewrite</module> |
| sofort die Verarbeitung dieser Regel und fährt mit der nächsten Regel |
| fort. Wenn das <em>Pattern</em> übereinstimmt, sucht |
| <module>mod_rewrite</module> nach zugehörigen Regelbedingungen |
| (RewriteCond-Direktiven, die in der Konfiguration unmittelbar über |
| der RewriteRule stehen). Wenn keine vorhanden sind, ersetzt es die |
| URL durch einen neuen Wert, der aus dem String <em>Substitution</em> |
| konstruiert wird, und fährt mit seiner Regelschleife fort. Wenn |
| jedoch Bedingungen vorhanden sind, startet es eine innere Schleife |
| zur Verarbeitung dieser in der Reihenfolge, in der sie aufgeführt |
| sind. Für Bedingungen ist die Logik anders: Wir gleichen kein |
| Muster gegen die aktuelle URL ab. Stattdessen erstellen wir zuerst |
| einen String <em>TestString</em> durch Expansion von Variablen, |
| Rückreferenzen, Map-Nachschlagungen <em>usw.</em>, und dann |
| versuchen wir, <em>CondPattern</em> dagegen abzugleichen. Wenn das |
| Muster nicht übereinstimmt, schlägt die gesamte Menge von |
| Bedingungen und die zugehörige Regel fehl. Wenn das Muster |
| übereinstimmt, wird die nächste Bedingung verarbeitet, bis keine |
| weiteren Bedingungen verfügbar sind. Wenn alle Bedingungen |
| übereinstimmen, wird die Verarbeitung mit der Ersetzung der URL |
| durch <em>Substitution</em> fortgesetzt.</p> |
| |
| </section> |
| |
| </manualpage> |