Advertisement
  1. Code
  2. Web Development

Ein ausführlicher mod_rewrite Leifaden für Apache

by
Read Time:26 minsLanguages:

German (Deutsch) translation by Ines Willenbrock (you can also view the original English article)

Zweimal im Monat greifen wir einige der Lieblingsbeiträge unserer Leser aus der Geschichte von Nettuts+ auf. Dieses Tutorial wurde erstmals im vergangenen September veröffentlicht.

Wenn Leute an .htaccess Konfiguration denken, das erste, was in ihren Köpfen knallen könnte, ist URL-Manipulation mit mod_rewrite. Aber sie sind oft über die Komplexität von mod_rewrite frustriert. Dieses Tutorial führt Sie durch alles, was Sie für die gängigsten mod_rewrite Aufgaben wissen müssen.

Mod_rewrite Schimpftiraden

Die Gedanken über mod_rewrite sind sehr unterschiedlich. Um ein schnelles Gefühl für das zu bekommen, was die Welt denkt, habe ich gerade eine Twitter-Suche auf "mod_rewrite" ausgeführt. Hier ist ein Beispiel für das, was zurückgegeben wurde.

mldk: Aargh! .htaccess und mod_rewrite kann so ein Schmerz im --- sein!

bsterzenbach: Mensch liebe ich mod_rewrite. Ich könnte den Rest meines Lebens damit arbeiten und es immer noch nicht meistern - so mächtig

mikemackay: Ich liebe immer noch die totale Flexibilität von mod_rewrite - komme wieder zur Rettung So oft übersehen... und einfacher, als Sie vielleicht auch denken!

hostpc: Ich hasse mod_rewrite. Diese Dang-Anwendung funktioniert nicht ordnungsgemäß :(

awanderingmind: Oh Wordpress und Apache, wie du mich verärgerst. Mod_rewrite soll verdammt sein!

danielishiding: Warum wird mod_rewrite nicht funktionieren! Verdammt!

Ein paar Dinge, die ich bemerkt habe, sind, dass die Menschen die Macht der mod_rewrite deutlich erkennen, aber oft von der Syntax frustriert sind. Das ist nicht verwunderlich, wenn man bedenkt, dass die Titelseite der Apache-mod_rewrite-Dokumentation im Wesentlichen dasselbe sagt:

Trotz der vielen Beispiele und Dokumente, ist mod_rewrite voodoo. Verdammt cooles voodoo, aber immer noch voodoo." — Brian Moore

Was für eine Abtörner! In diesem Artikel werde ich die Dinge wirklich noch weiter verbessern. Wir werden nicht nur die Syntax von mod_rewrite besprechen, sondern ich stelle auch einen Workflow vor, mit dem Sie Ihre mod_rewrite Probleme debuggen und lösen können. Unterwegs werden wir einige nützliche Beispiele aus der Praxis überprüfen.

Bevor wir beginnen, eine Warnung: wie bei vielen Themen - dieses vor allem - Sie werden nichts lernen, es sei denn, Sie versuchen es auf eigene Faust! Das ist einer der Gründe, warum ich mich auf das Lehren eines Debug-Workflows konzentrieren werde. Wie üblich zeige ich Ihnen, wie Sie Ihr System einrichten können, wenn Sie das Modul noch nicht geladen haben. Ich fordere Sie dringend auf, die Beispiele auf Ihrem eigenen Server zu durcharbeiten - am besten in einer Testumgebung.


Was ist mod_rewrite?

mod_rewrite ist ein Apache-Modul, das eine serverseitige Manipulation angeforderter URLs ermöglicht.

mod_rewrite ist ein Apache-Modul, das eine serverseitige Manipulation angeforderter URLs ermöglicht. Eingehende URLs werden anhand einer Reihe von Regeln überprüft. Die Regeln enthalten einen regulären Ausdruck, um ein bestimmtes Muster zu erkennen. Wenn das Muster in der URL gefunden wird und die richtigen Bedingungen erfüllt sind, wird das Muster durch eine bereitgestellte Ersetzungszeichenfolge oder -aktion ersetzt. Dieser Prozess wird fortgesetzt, bis keine weiteren Regeln mehr vorhanden sind oder der Prozess explizit zum Beenden aufgefordert wird.

Dies ist in diesen drei Punkten zusammengefasst:

  • Es gibt eine Liste von Regeln, die in der Reihenfolge verarbeitet werden.
  • Wenn eine Regel übereinstimmt, werden die Bedingungen für diese Regel überprüft.
  • Wenn alles ein ok ist, macht es eine Substitution oder Aktion.

Vorteile von mod_rewrite

Es gibt einige offensichtliche Vorteile für die Verwendung eines URL-Umschreibewerkzeugs wie dieses, aber es gibt andere, die möglicherweise nicht so offensichtlich sind.

mod_rewrite wird am häufigsten verwendet, um hässliche, kryptische URLs in so genannte "freundliche URLs" oder "saubere URLs" zu transformieren.

Als zusätzlichen Bonus sind diese URLs auch suchmaschinenfreundlicher. Betrachten Sie das folgende Beispiel:

Nicht nur ist der endgültige Link angenehmer zu lesen, es ist auch möglich, dass Suchmaschinen semantische Bedeutung daraus extrahieren. Diese grundlegende Art des URL-Umschreibens ist eine Möglichkeit, mod_rewrite zu verwenden. Wie Sie jedoch sehen werden, kann es viel mehr als nur diese einfachen Transformationen tun.

Im gleichen Beispiel wird behauptet, dass es Sicherheitsvorteile gibt, wenn mod_rewrite Ihre URLs umschreibt. Stellen Sie sich im gleichen Beispiel den folgenden Angriff auf die Benutzer-id vor:

Im ersten Beispiel wird das PHP-Skript explizit aufgerufen und muss die ungültige id-Nummer verarbeiten. Ein schlecht geschriebenes Skript würde wahrscheinlich fehlschlagen, und in einem extremeren Fall (in einer schlecht geschriebenen Webanwendung) kann eine fehlerhafte Eingabe zu Datenbeschädigungen führen. Wenn dem Benutzer jedoch immer nur die freundlicheren URLs angezeigt werden, würden sie nie wissen, dass die user.php-Seite existiert.

Der Versuch des gleichen Angriffs in diesem Fall würde wahrscheinlich fehlschlagen, bevor er überhaupt das PHP-Skript erreicht. Dies liegt daran, dass im Kern von mod_rewrite der Mustervergleich für reguläre Ausdrücke liegt. Im obigen Beispielfall hätten Sie eine Ziffer erwartet, zum Beispiel (\d+), nicht Zeichen wie a-z. Diese zusätzliche Abstraktionsebene ist aus Sicherheitsgründen gut.


Aktivieren von mod_rewrite auf dem Server

Das Aktivieren mod_rewrite oder eines Apache-Moduls muss über die globale Konfigurationsdatei (httpd.conf) erfolgen.

Genau wie die Aktivierung der .htaccess-Unterstützung muss das Aktivieren von mod_rewrite oder eines beliebigen Apache-Moduls über die globale Konfigurationsdatei (httpd.conf) erfolgen. Genau wie zuvor, da mod_rewrite Nutzung so weit verbreitet ist, haben Hosting-Unternehmen es fast immer aktiviert. Wenn Sie jedoch vermuten, dass Ihr Hosting-Unternehmen dies nicht tut - und wir werden dies unten testen - kontaktieren Sie sie, und sie werden es wahrscheinlich aktivieren.

Wenn Sie Ihre eigene Apache-Installation laufen haben, ist es erwähnenswert, dass mod_rewrite beim Kompilieren einbezogen werden muss, da dies nicht standardmäßig erfolgt. Es ist jedoch so häufig, dass fast alle Installationsanleitungen, einschließlich Apaches, in ihrem Beispiel zeigen, wie es geht.

Wenn Sie der Administrator für Ihren Webserver sind und sicherstellen möchten, dass Sie das Modul laden, sollten Sie in der Datei httpd.conf nachsehen. In der Konfigurationsdatei wird es einen großen Abschnitt geben, der eine Reihe von Modulen lädt. Die folgende Zeile wird wahrscheinlich irgendwo in der Datei angezeigt. Wenn es so ist, toll! Wenn es auskommentiert ist, was bedeutet, dass es ein # Symbol am Anfang der Zeile gibt, dann entkommentieren Sie es, indem Sie die # entfernen:

Ältere Version von Apache 1.3 können verlangen, dass Sie die folgende Direktive nach der LoadModule-Direktive hinzufügen.

Dies scheint jedoch in Apache 2 und später verschwunden zu sein. Es ist nur die LoadModule-Direktive erforderlich.

Wenn Sie die Konfigurationsdatei überhaupt ändern mussten (nicht wahrscheinlich), müssen Sie den Webserver neu starten. Wie immer sollten Sie daran denken, eine Sicherung der Originaldatei zu erstellen, falls Sie später darauf zurückkommen müssen.


Testen auf mod_rewrite

Sie können auf verschiedene Arten testen, ob mod_rewrite aktiviert ist/funktioniert. Eine der einfachsten Methoden ist es, die Ausgabe der PHP-Funktion phpinfo anzuzeigen. Erstellen Sie diese sehr einfache PHP-Seite, öffnen Sie sie in Ihrem Browser und suchen Sie in der Ausgabe nach "mod_rewrite".

mod_rewrite sollte im Abschnitt "Geladene Module" der Seite wie folgt angezeigt werden:

Good mod_rewrite enabledGood mod_rewrite enabledGood mod_rewrite enabled

Wenn Sie PHP nicht verwenden (obwohl ich es für den Rest des Tutorials werde), gibt es einige andere Möglichkeiten zu überprüfen, ob es aktiv ist. Apache kommt mit einer Reihe von Befehlszeilen-Tools, auf die Sie verweisen können. Sie können auch andere Tools wie apachectl oder httpd verwenden, um direkt auf das Modul zu testen. Es gibt Befehlszeilenschalter, mit denen Sie alle geladenen Module in der vorhandenen Installation überprüfen können. Sie können Folgendes ausführen, um eine Auflistung aller geladenen Module zu erhalten.

Dieser Befehl zeigt die Seite "Hilfe" für den Befehl an. Ich führe dann den Befehl aus und suche in den Ergebnissen nach "rewrite" und es zeigt, dass es eine Ausgabezeile gab, die übereinstimmte!

apache testapache testapache test

Schließlich, wenn Sie immer noch unsicher sind, ob es aktiviert ist, probieren Sie es einfach aus! Die folgende .htaccess-Datei leitet jede Anforderung im angegebenen Ordner an die Datei good.html um. Das heißt, wenn mod_rewrite funktioniert, sollten Sie good.html sehen.

Good mod_rewrite workedGood mod_rewrite workedGood mod_rewrite worked
Bad mod_rewrite didnt workBad mod_rewrite didnt workBad mod_rewrite didnt work

Innerhalb .htaccess

Wie immer kann alles, was Sie in eine .htaccess-Datei eintragen können, auch in der globalen Konfigurationsdatei platziert werden. Bei mod_rewrite gibt es kleine Unterschiede, wenn Sie eine Regel in die eine oder andere setzen. Vor allem:

Wenn Sie [...] Regeln in eine .htaccess-Datei [...] setzen, wird das Verzeichnispräfix (/) aus der REQUEST_URI-Variable entfernt, da alle Anforderungen automatisch als relativ zum aktuellen Verzeichnis angenommen werden. - Apache-Dokumentation

Dies sollten Sie beachten, wenn Sie Beispiele online sehen oder wenn Sie ein Beispiel selbst versuchen: Achten Sie auf den führenden Schrägstrich. Ich werde versuchen, dies im Folgenden zu klären, wenn wir einige Beispiele gemeinsam durcharbeiten.


Reguläre Ausdrücke

Dieses Tutorial beabsichtigt nicht, Ihnen reguläre Ausdrücke beizubringen. Für diejenigen unter Ihnen, die mit ihnen vertraut sind, scheinen die regulären Ausdrücke, die in mod_rewrite verwendet werden, zwischen den Versionen von Apache zu variieren. In Apache 2.0 sind es Perl Compatible Regular Expressions (PCRE). Dies bedeutet, dass viele der Verknüpfungen, an die Sie gewöhnt sind, z. B. \w auf [A-Za-z0-9_], \d bezogen auf [0-9] und vieles mehr existieren. Mein spezielles Hosting-Unternehmen verwendet jedoch Apache 1.3 und die regulären Ausdrücke sind eingeschränkter.

Hilfreiche RegEx-Ressourcen

Wenn Sie keine regulären Ausdrücke kennen, sind hier einige nützliche Tutorials, die Sie schnell auf den Laufenden bringen.

Und ein paar Referenzen, die jeder kennen sollte:

Wenn Sie sich noch nicht die Zeit genommen haben, reguläre Ausdrücke zu lernen, empfehle ich ihnen sehr, dies zu tun. Sie sind ein unglaublich hilfreiches Werkzeug. Wie es üblicherweise der Fall ist, sind sie nicht ganz so komplex, wie manche vielleicht denken. Ich habe die oben genannten Links aus meiner langjährigen Erfahrung in der Arbeit mit regulären Ausdrücken ausgewählt. Ich glaube, dass diese Leitfäden eine sehr gute Arbeit leisten, um die Grundlagen zu vermitteln.

Wissen über Reguläre Ausdrücke ist eine Notwendigkeit, wenn Sie mod_rewrite effektiv nutzen möchten.


Ein Gefühl dafür bekommen.

Okay, Sie haben geduldig genug gewartet; lassen Sie uns ein kurzes Beispiel durchgehen. Dies ist in den verlinkten Quelldateien enthalten. Hier ist der Code aus der .htaccess-Datei:

Bevor ich den obigen Code erklären kann, sollten wir schnell die anderen Dateien im Verzeichnis überprüfen.

Das Verzeichnis enthält eine index.php und eine user.php-Datei. Der Index hat nur einige Links in verschiedenen Formaten zur Benutzerseite. Der PHP-Code wird ausschließlich für Debugging-Zwecke verwendet, um zu bestätigen, dass auf die Seite zugegriffen wurde und was der angegebene "id"-Parameter enthielt. Hier ist der Inhalt von user.php:

Dieses Beispiel hat ein paar verschiedene Abschnitte. Beachten Sie zunächst, dass URL Rewriting über die RewriteEngine-Direktive aktiviert werden muss! Wenn Sie Ihre .htaccess-Datei Rewrite-Regeln verwenden werden, sollten Sie diese Zeile immer einschließen. Andernfalls können Sie nicht sicher sein, ob dies aktiviert ist oder nicht. Als Faustregel gilt, nehmen Sie sie immer mit auf . Die Zeichenfolge "on" unterscheidet nicht zwischen Groß- und Kleinschreibung.

Die erste RewriteRule dient der Behandlung der user.php-Seite. Wie die Kommentare zeigen, schreiben wir die benutzerfreundliche URL in das Format der normalen URL um. Wenn die benutzerfreundliche URL als Eingabe eintrifft, wandeln wir sie in die Standard-Abfragezeichenfolge-URL um. Wenn wir es aufschlüsseln, bekommen wir:

Hier sind einige Beispiele und eine Erklärung für jedes:

User.php
Eingehend Treffer Erfassen Ausgehend Ergebnis
user.php?id=joe Nein user.php?id=joe Normal
user/joe Ja joe user.php?id=joe Gut
user/joe/ Ja joe user.php?id=joe Gut
user/joe/x Nein user/joe/x Fehler

Das erste Beispiel geht unbeeinflusst von der RewriteRule durch und funktioniert einwandfrei. Das zweite und dritte Beispiel stimmen mit der RewriteRule überein, werden entsprechend umgeschrieben und funktionieren am Ende auch einwandfrei. Das letzte Beispiel stimmt nicht mit der Regel überein und bleibt unberührt. Der Server verfügt nicht über ein User-Verzeichnis und versucht nicht, es zu finden. Dies ist wie erwartet, weil user/joe/x in erster Linie eine schlechte URL ist!

Dieses Beispiel war ziemlich leicht zu verstehen. Allerdings gab es viele winzige Details, die ich beschönigte. Um komplexere Skripte auszuführen, sollten wir genau klären, was oben geschieht. Im folgenden Abschnitt werde ich jeden Schritt im Zyklus durchlaufen.

HINWEIS: Wenn dieses obige Beispiel für Sie nicht funktioniert hat, ist es möglich, dass Ihre Apache- oder mod_rewrite-Versionen nicht PCRE-kompatibel sind. Versuchen Sie, ^user/(\w+)/?$ in in ^user/([a-z]+)/?$ zu ändern. Beachten Sie, dass ich nicht die Kurzschreibweise \w verwendet habe. Wenn diese Version für Sie funktioniert, müssen Sie die Regex-Kurzschreibweisen vermeiden und stattdessen ihre längeren Entsprechungen verwenden (siehe Abschnitt Reguläre Ausdrücke oben).


Ablauf der Ausführung im Detail

Der Ablauf der Ausführung durch die Umschreiberegeln ist simpel, aber nicht gerade einfach. Also werde ich die schmerzhaften Details aufschlüsseln.

Alles beginnt damit, dass der Benutzer eine Anforderung an Ihren Server stellt. Sie geben eine URL in die Adressleiste ihres Browsers ein, ihr Browser übersetzt diese in eine HTTP-Anforderung, die an den Server gesendet werden soll, Apache empfängt diese Anforderung und zerlegt sie dann in Stücke. Hier ist ein Beispiel:

Full URL AnalysisFull URL AnalysisFull URL Analysis

Beachten Sie, dass ich immer dann, wenn ich eine der Apache-Variablen erwähne, eine seltsam aussehende Syntax verwende: %{APACHE_VAR}. Ich tue dies nur, weil es der Syntax ähnelt, die mod_rewrite verwendet, um auf seine Variablen zuzugreifen. Es ist jedoch der Name innerhalb der geschweiften Klammern, der wichtig ist.

Mit welchem Teil geht mod_rewrite um? Wenn Sie in einer .htaccess-Datei arbeiten, arbeiten Sie mit dem REMOTE_URI Teil, aber ohne den führenden Schrägstrich. Ich habe dies bereits erwähnt; es neigt dazu, etwas zu sein, das für die meisten Menschen sehr verwirrend ist, wenn sie anfangen. Wenn Sie jedoch innerhalb der globalen Konfigurationsdatei arbeiten, belassen Sie den führenden Schrägstrich.

Um so genau wie möglich zu sein, ist in der Apache-Dokumentation diese Beschreibung des „URL-Teils“ vergraben, auf den mod_rewrite reagiert:

Das Pattern ist immer ein regulärer Ausdruck, der mit dem URL-Pfad der eingehenden Anforderung abgeglichen wird (der Teil nach dem Hostnamen, aber vor einem Fragezeichen, das den Anfang einer Abfragezeichenfolge angibt). Apache-Dokumentation

Um alle Mehrdeutigkeiten zu entfernen, die in diesen beiden URLs unten in Gold hervorgehoben sind, ist der "URL-Teil", auf den mod_rewrite in einer .htaccess-Datei einwirkt:

The Rewrite Portion of the URLThe Rewrite Portion of the URLThe Rewrite Portion of the URL

Für den Rest dieses Abschnitts verwende ich diese beiden URLs, um den Ausführungsfluss zu beschreiben. Ich beziehe mich auch auf die erste URL als "grüne" URL und die zweite als "blaue" URL. Ich werde "URL-Teil" während dieser Analyse verwenden, also den REMOTE_URI ohne den führenden Schrägstrich.


URL vs. URI

Für diese pedantischen Leser sind diese beiden Dinge, die ich URLs nenne, eigentlich URIs. Die Definition eines URI (Uniform Resource Identifier) unterscheidet sich von einem URL (Uniform Resource Locator).

  • URI: Ein Indikator dafür, wo sich eine Ressource befindet. Dies bedeutet, dass mehrere URIs auf dieselbe Ressource verweisen können, aber selbst unterschiedliche Adressen sind. Das Folgen eines URI kann eine beliebige Anzahl von Hops oder Umleitungen in Anspruch nehmen, bis er tatsächlich bei der Ressource eintrifft.
  • URL: ein strengerer Begriff, der den genauen Speicherort einer Ressource identifiziert. Dieser feine Unterschied hat sich im Laufe der Zeit so verwischt, dass sich niemand um den Unterschied kümmert. Ich werde weiterhin den Begriff URL verwenden, weil die Leute damit vertrauter sind.

Jetzt wissen wir, worauf die Rewrite Regeln reagieren werden. Sobald Apache die Anforderung analysiert hat, übersetzt es das in die Datei, die es für notwendig hält, und fährt fort, diese Datei abzurufen. An diesem Punkt wird es Verzeichnisse durchqueren und auf die .htaccess-Dateien stoßen. Unter der Annahme, dass diese Datei die RewriteEngine aktiviert, kann jede RewriteRule die URL ändern. Eine drastische Änderung (z. B. eine, die Apache auf ein anderes Verzeichnis anstatt auf das ursprüngliche Verzeichnis verweist, auf das es zusteuerte), wird dazu führen, dass Apache eine Unteranforderung ausgibt und mit dem Abrufen der neuen Datei fortfährt.

In den meisten Fällen sind Unteranforderungen für Sie unsichtbar.

In den meisten Fällen sind Unteranforderungen für Sie unsichtbar. Dieses Implementierungsdetail ist für die meisten einfachen Umschreibungen, die Sie jemals schreiben oder verwenden werden, nicht wichtig. Wichtiger zu wissen ist, wie Apache die Rewrite-Regeln in einer .htaccess-Datei verarbeitet.

Die Regeln in einer .htaccess-Datei werden in der Reihenfolge verarbeitet, in der sie angezeigt werden. Beachten Sie, dass jede RewriteRule auf den "URL-Teil" reagiert, der dem REMOTE_URI ähnelt. Wenn eine Regel eine Ersetzung vornimmt, wird das geänderte "URL-Teil" an die nächste Regel übergeben. Dies bedeutet, dass die URL, die eine Regel verarbeitet, möglicherweise durch eine vorherige Regel bearbeitet wurde! Die URL wird von jeder Regel aktualisiert, die auf zu zutrifft. Das ist wichtig zu erinnern!

Flussdiagramm

Hier ist ein Flussdiagramm, das versucht, eine Visualisierung des generischen Ausführungsflusses über mehrere Regeln in einer .htaccess-Datei bereitzustellen:

mod_rewrite flow chartmod_rewrite flow chartmod_rewrite flow chart

Beachten Sie, dass der Wert, der in die Rewrite-Regeln eingeht, oben im Flussdiagramm der "URL-Teil" ist und wenn die Ersetzung erfolgreich ist, wird der geänderte Teil mit der nächsten Regel fortgesetzt.

Jeder RewriteCond ist einer einzelnen RewriteRule zugeordnet.

Ich habe früher auf die Umschreibungsbedingungen hingewiesen, bin aber nicht ins Detail gegangen. Jede RewriteCond ist einer einzelnen RewriteRule zugeordnet. Die Bedingungen werden vor der Regel angezeigt, der sie zugeordnet sind, werden jedoch nur ausgewertet, wenn das Muster der Regel übereinstimmt. Wie das Flussdiagramm zeigt, wird Apache überprüfen, ob es Bedingungen für diese Regel gibt, wenn das Muster einer Rewrite-Regel übereinstimmt. Wenn dies nicht der Grund ist, wird die Ersetzung fortgesetzt. Wenn es dagegen Bedingungen gibt, dann wird es die Substitution nur machen, wenn alle Bedingungen wahr sind. Lassen Sie uns dies anhand es konkreten Beispieles visualisieren.

Die URLs, mit denen ich arbeite, sind Teil des "Profile Example", das ich in den Quellcodedownload im Verzeichnis "profile_example" aufgenommen habe. Dies ist ähnlich wie das vorherige Beispiel mit dem user.php, aber es hat jetzt eine profile.php-Seite, eine hinzugefügte Rewrite-Regel und eine Bedingung!

Werfen wir einen Blick auf den Code und Apaches Ausführungsfluss durch ihn:

Profile Rewrite RulesProfile Rewrite RulesProfile Rewrite Rules

Hier gibt es zwei Regeln. Regel #1 ist das gleiche wie das Benutzerbeispiel, das wir zuvor überprüft haben. Regel #2 ist neu; beachten Sie, dass sie eine Bedingung hat. Der "URL-Teil", über den wir gesprochen haben, durchläuft die Regeln in der Reihenfolge, von oben nach unten.

Der Schlüssel zum Verständnis dieses Beispiels besteht darin, zuerst das Ziel zu verstehen. Ich werde freundliche Profil-URLs zulassen, aber ich werde den Zugriff auf die PHP-Seite explizit direkt verbieten. Beachten Sie, einige Leute könnten sagen, dass dies eine schlechte Idee ist. Sie könnten sagen, dass dies als Entwickler das Debuggen schwieriger machen wird. Das ist sicherlich wahr; ich empfehle nicht wirklich, einen Trick wie diesen zu tun, aber es ist ein ausgezeichnetes Beispiel! Praktischere Verwendungen für mod_rewrite werden später in diesem Tutorial erscheinen.

In diesem Sinne, lassen Sie uns sehen, was mit unserer grünen URL passiert. Wir wollen, dass diese Erfolg hat.

Green URL ExecutionGreen URL ExecutionGreen URL Execution

Oben sehen Sie die THE_REQUEST-Variable von Apache. Ich setze dies an die Spitze, da sich dieser Variablenwert im Gegensatz zu vielen der Apache-Variablen, mit denen wir uns befassen werden, während der Dauer der Anforderung niemals ändern wird! Dies ist einer der Gründe, warum Regel #2 %{THE_REQUEST} verwendet. Unter THE_REQUEST sehen wir den grünen "URL-Teil", der in die erste Regel geht:

  • Die URL stimmt mit dem Muster überein.
  • Es gibt keine Bedingungen, also geht es weiter.
  • Die Substitution erfolgt.
  • Es gibt keine Flags, also geht es weiter.

Nachdem die erste Regel durchlaufen wurde, hat sich die URL geändert. Die Gesamt-URL wurde in profile.php?id=joe umgeschrieben, die Apache dann aufschlüsselt und viele seiner Variablen aktualisiert. Der ?id=joe-Teil wird vor uns ausgeblendet und profile.php, der neue "URL Part", wird an die zweiten Regel übergeben. Dies ist unsere erste Begegnung mit Bedingungen:

  • Die URL stimmt mit dem Muster überein.
  • Es gibt Bedingungen, also werden wir die Bedingungen ausprobieren.
  • THE_REQUEST enthält kein profile.php, daher schlägt die Bedingung fehl.
  • Da eine Bedingung fehlgeschlagen ist, ignorieren wir die Ersetzung und Flags.
  • Die URL bleibt durch diese Regel unverändert.

An diesem Punkt haben wir es durch alle Umschreibungen geschafft und die Seite profile.php?id=joe wird ordnungsgemäß abgerufen.


Hier ist, wie die Ausführung für die blaue URL aussieht - die, die wir fehlschlagen lassen möchten:

Blue URL ExecutionBlue URL ExecutionBlue URL Execution

Wieder stelle ich den THE_REQUEST Wert an die Spitze. Das blaue "URL-Teil" trifft Regel #1:

  • Die URL stimmt nicht mit dem Muster überein.
  • Alles andere wird ignoriert und die URL geht unverändert weiter.

Die erste Regel war einfach. Wie so oft entspricht eine URL, die Sie haben, nicht mit dem Muster einer Regel und verläuft unverändert. Als Nächstes kommt Regel #2:

  • Die URL stimmt mit dem Muster überein.
  • Es gibt Bedingungen, also werden wir die Bedingungen ausprobieren.
  • THE_REQUEST enthält profile.php, so dass die Bedingung erfüllt ist.
  • Wir können die Substitution vornehmen.
  • "-" ist eine besondere Substition, die bedeutet: nichts ändern.
  • Es gibt Flags auf der Regel, also verarbeiten wir die Flags.
  • Es gibt eine F-Flag, was bedeutet, dass eine Verboten Antwort zurückgegeben wird.
  • Eine 403 Zugriff Verboten Antwort wird an den Client gesendet.

Das F-Flag bezieht sich auf eine "verboten Antwort".

Ein paar Dinge sind es wert, wiederholt zu werden. Damit die Substitution funktioniert, müssen alle Bedingungen erfüllt sein. In diesem Fall gibt es nur eine; sie trifft zu, so dass die Substitution vorgenommen wird. Beachten Sie, dass - eine spezielle Substitution ist, die nichts ändert. Dies ist nützlich, wenn Sie Flags verwenden möchten, um etwas für Sie zu tun, was genau das ist, was wir in diesem Fall tun möchten.

Hier ist die vertraute Tabelle der Beispiel-URLs und deren Antworten:

Profile.php
Eingehend Match Erfassen Ausgehend Ergebnis
profile.php?id=joe Ja (#2) profile.php?id=joe Verboten
profile/joe Ja (#1) joe profile.php?id=joe Gut
profile/joe/ Ja (#1) joe profile.php?id=joe Gut
profile/joe/x Nein profile/joe/x Fehler

Syntax

Bevor Sie die Syntax von RewriteRule und RewriteCond verwenden, schlage ich vor, dass Sie zuerst das AddedBytes Cheatsheet herunterladen. Dieses Cheatsheet listet die nützlichsten Servervariablen und -flags auf, enthält Tipps für reguläre Ausdrücke und sogar einige Beispiele.

Beginnen wir mit RewriteRule. Sie können Apaches Dokumentation der RewriteRule jederzeit besuchen, wenn Sie weitere Informationen oder Anweisungen benötigen.

Syntax of RewriteRuleSyntax of RewriteRuleSyntax of RewriteRule

Das Cheatsheet, das oben verlinkt ist, zeigt die verschiedenen Flags an, die Ihnen zur Verfügung stehen. Während viele Tutorials diese im Detail behandeln, halten wir die Dinge einfach und besprechen die, die ich am häufigsten in realen Projekten verwendet sehe.

Syntax of RewriteCondSyntax of RewriteCondSyntax of RewriteCond

Debug-Workflow

Wenn Sie mit mod_rewrite arbeiten und neue Regeln erstellen, beginnen Sie immer mit einer simplen, stark vereinfachten Version der Regel und arbeiten Sie sich bis zur endgültigen Version durch. Widerstehen Sie dem Drang, alles auf einmal zu tun. Dasselbe gilt für die Bedingungen. Fügen Sie Regeln und Bedingungen nacheinander hinzu. Testen Sie oft!

Das Schlüsselkonzept, das ich mit diesem Ansatz zu vermitteln versuche, ist, dass dies Sie schnell wissen lässt, wenn eine von Ihnen vorgenommene Änderung nicht richtig funktioniert oder etwas falsch funktioniert. Andernfalls werden Sie unweigerlich auf eine Art Fehler stoßen und müssen alle Änderungen rückgängig machen, die Sie vorgenommen haben, um das Problem aufzuspüren. Dies ist ein sehr Achterbahn-Ansatz und wird wahrscheinlich zu Frustration führen. Wenn Sie jedoch ständig vorankommen und jeder Schritt auf dem Weg zu praktikabelen Checkpoints geht, sind Sie in viel, viel besserer Form.

Die Leute ignorieren diesen Rat oft, erstellen eine komplexe Regel, und sie funktioniert am Ende nicht mehr. Stunden später stellen sie fest, dass das Problem nicht im komplexen Teil lag, sondern ein einfacher Fehler im regulären Ausdruck, der viel früher hätte erwischt werden können, wenn sie die Regel sorgfältig konstruiert hätten, wie ich es oben erklärt habe. Dasselbe gilt für die Dekonstruktion einer Regel, um ein Problem zurückzuentwickeln. Dieser Ansatz wird die Frustration ernsthaft verringern!


In den Beispielen

In den folgenden Beispielen gehen wir immer davon aus, dass die Domain der Website example.com ist. Dieser Domain Name ist wichtig, da er sich auf die HTTP_HOST-Variable auswirkt und eine Umleitungs-URL zu einer anderen Datei auf Ihrer Website angibt. Beachten Sie dies, wenn Sie beabsichtigen, eines der folgenden Beispiele für Ihre eigene Website zu ändern. Wenn ja, ersetzen Sie einfach "example.com" durch Ihre Domain. Nettuts+ würde z. B. "example.com" ersetzen; mit "nettuts.com".


Entfernen von www

Dies ist die klassischste Umschreibungsregel. Das folgende Skript wird auf jeden hören, der über http://www.example.com auf Ihre Website kommt. Diejenigen, die dies tun, erhalten eine harte Umleitung, und damit wird die Standortleiste in ihrem Browser entsprechend aktualisiert.

Die RewriteRule oben entspricht allem und speichert sie als $1 - wie durch die umhüllenden Klammern angegeben. Der wichtige Teil in diesem Beispiel ist jedoch die RewriteCond. Diese Bedingung überprüft die HTTP_HOST-Variable, um festzustellen, ob sie mit "www." begann. Wenn diese Bedingung zutrifft, erfolgt die Umschreibung:

  • Die Ersetzung ist eine vollständige URL (sie beginnt mit http://)
  • Die Substitution enthält $1, die früher gespeichert wurde
  • Das Flag [R=301] leitet den Browser an die neu geschriebene URL um. Dies ist eine harte Umleitung in dem Sinne, dass es den Browser zwingt, die neue Seite zu laden und seine Adressleiste mit der neuen URL zu aktualisieren.
  • Das Flag [L] gibt an, dass dies die letzte zu analysierende Regel ist. Jenseits dieser Zeile sollte die Reweite Engine anhalten.

Wenn die eingehende URL "http://www.example.com/user/index.html" gewesen wäre, dann wäre HTTP_HOST auf www.example.com gesetzt worden, und die Umschreibung würde ausgelöst, wodurch http://example.com/user/index.html erstellt würde.

Wenn die eingehende URL hingegen "http://example.com/user/index.html" gewesen wäre, wäre HTTP_HOST example.com gewesen, die Bedingung würde fehlschlagen, und das Rewrite-Modul würde mit der URL unverändert fortfahren.


Hotlinking verbieten

Hotlinking, auf Wikipedia als Inline Linking bezeichnet, ist der Begriff, der verwendet wird, um eine Site zu beschreiben, die von einer anderen Website einbettet.

Hotlinking, auf Wikipedia als Inline Linking bezeichnet, ist der Begriff, der verwendet wird, um eine Site zu beschreiben, die von einer anderen Website einbettet. Normalerweise wird eine Website - der Verlinker - einen Link zu einer Mediendatei (z. B. ein Bild oder Video) enthalten, die auf einer anderen Website, dem Content Host, gehostet wird. In diesem Szenario verschwenden die Server des Inhaltshosts Bandbreite, um Inhalte für eine andere Website bereitzustellen.

Der häufigste und einfachste Ansatz zum Verhindern von Hotlinking besteht darin, eine bestimmte Anzahl von Websites auf die Whitelist zu setzen und alles andere zu blockieren. Um zu ermitteln, wer den Inhalt von Ihrer Website anfordert, können Sie den Referrer überprüfen.

Der HTTP_REFERER Header wird vom Browser oder Client festgelegt, der die Ressource anfordert.

Letztendlich ist es nicht 100% zuverlässig, aber es ist im Allgemeinen mehr als effektiv, um den Großteil der Hotlinks zu verhindern. In unserem Skript müssen wir also überprüfen, ob der Referrer in eine Whitelist akzeptabler Referrer vorkommt. Wenn nicht, dann sollten wir ihnen eine verbotene Warnung zeigen:

Oben sucht die RewriteRule nach der Anforderung einer Datei mit einer beliebigen gängigen Bilderweiterung, z. B. .gif, .png oder .jpg. Fühlen Sie sich frei, weitere Erweiterungen zu dieser Liste hinzuzufügen, wenn Sie .flv, .swf oder andere Dateien schützen möchten.

Die Domains, die auf diese Inhalte zugreifen dürfen, sind "example.net" und "example.com". In beiden Fällen schlagen die Rewrite-Conditions fehl und die Substitution erfolgt nicht. Wenn jedoch eine andere Domäne einen Versuch unternimmt - sagen wir "sample.com" - dann werden alle Rewrite-Conditions erfüllt, die Substitution erfolgt, und die [F] Verboten Aktion wird ausgelöst.


Hotlinkers ein Warnbild geben

Im vorherigen Beispiel wird eine Warnung 403 Verboten zurückgegeben, wenn jemand versucht, Inhalte von Ihrem Server mit einem Hotlink zu verknüpfen. Sie können tatsächlich einen Schritt weiter gehen und dem Hotlinker jede Ressource Ihrer Wahl senden! Sie können z. B. ein Warnbild mit dem Text "Hotlinking ist nicht zulässig" zurückgeben. Auf diese Weise erkennt der Täter seinen Fehler und hostet eine Kopie auf seinem eigenen Server. Die einzige erforderliche Änderung besteht darin, die Umschreibesubstitution zu durchlaufen und das ausgewählte Bild anstelle des angeforderten Bildes bereitzustellen:

Beachten Sie, dass dies ein Beispiel für das ist, was ich eine "harte" oder "externe" Umleitung nenne. Die RewriteRule hat eine URL im Ersetzungsteil und auch das Flag [R].


Benutzerdefinierte 404

Ein netter Trick, den Sie mit htaccess machen können, ist zu bestimmen, ob der aktuelle "URL-Teil" zu einer tatsächlichen Datei oder einem Verzeichnis auf dem Webserver führt. Dies ist eine ausgezeichnete Möglichkeit, eine benutzerdefinierte 404 "Datei nicht gefunden" Seite zu erstellen. Wenn ein Benutzer beispielsweise versucht, eine Seite in einem bestimmten Verzeichnis abzurufen, die nicht vorhanden ist, können Sie ihn zu einer beliebigen Seite umleiten, z. B. zur index-Seite oder zu einer benutzerdefinierten 404-Seite.

Dies ist ein großartiges Beispiel für mod_rewrites Dateitestoperatoren. Sie sind identisch mit Dateitests in Bash-Shell-Skripten und sogar Perl-Skripten. Oben wird überprüft, ob es sich bei REQUEST_FILENAME nicht um eine Datei und nicht um ein Verzeichnis handelt. In dem Fall, in dem dies nicht der Fall ist, gibt es keine solche Datei für den Anfrage.

Wenn der Dateiname der eingehenden Anforderung nicht gefunden werden kann, lädt dieses Skript eine Seite "custom_404.html". Beachten Sie, dass es kein [R]-Flag gibt - dies ist eine stille Umleitung, keine harte Umleitung. Die Adressleiste des Benutzers ändert sich nicht, aber der Inhalt der Seite ist "custom_404.html".


Sicherheit an erster Stelle

Wenn Sie über verschiedene mod_rewrite Snippets verfügen, die Sie einfach auf andere Server oder Umgebungen verteilen möchten, sollten Sie vorsichtig sein. Jede ungültige Direktive in einer .htaccess-Datei löst wahrscheinlich einen internen Serverfehler aus. Wenn eine Umgebung, in die Sie das Snippet verschieben, mod_rewrite nicht unterstützt, können Sie sie vorübergehend beschädigen.

Eine Lösung für dieses Problem ist die "Prüfung" auf das mod_rewrite Modul. Dies ist mit jedem Modul möglich; umschließen Sie einfach Ihren mod_rewrite Code mit einem <IfModule> Block und Sie werden auf der sicheren Seite sein:


Schlussfolgerung

Ich hoffe, dass dieses Tutorial bewiesen hat, dass mod_rewrite nicht zu beängstigend ist. In der Tat können seine Macken und Geschwindigkeitsschwankungen durch sorgfältige Entwicklungspraktiken vermieden werden. Lassen Sie es mich wissen, wenn Sie Fragen haben!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.