This page has been robot translated, sorry for typos if any. Original content here.

Modul mod_rewrite Teil 2

Im letzten Kapitel haben wir uns mit den Grundlagen des Moduls mod_rewrite vertraut gemacht. Im betrachteten Beispiel verwendeten wir ein Konstrukt, das wörtlich Folgendes bedeutet: "Wenn jemand versucht, auf die .htaccess-Datei zuzugreifen, wird ein Fehler ausgegeben, der angibt, dass der Zugriff auf die Datei verboten ist."

Diese "Regel" ist global, dh jeder erhält die angegebene Fehlermeldung. Ich erinnere Sie daran, dass mod_rewrite ein Modul ist, das einen " regelbasierten Mechanismus zum dynamischen Ändern der angeforderten URLs" bietet.

Wir können die "Regel" mit Hilfe verschiedener "Regelbedingungen" begrenzen. Die "Regel" wird nur dann erfüllt, wenn zuvor eine Reihe von Bedingungen erfüllt sind.

Syntax : Die Bedingung muss der Regel vorausgehen!

Nehmen wir ein anderes Beispiel (Eintrag in der .htaccess-Datei): RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon RewriteRule ^.*$ - [F]

Der Zweck der ersten drei Datensätze wurde im ersten Teil der Veröffentlichung ausführlich besprochen. Ihre Funktion besteht darin, die "Rewriting-Engine", dh das Modul selbst, zu aktivieren.

Die letzten beiden Zeilen verbieten den Zugriff auf den Suchroboter mit dem Codenamen "EmailSiphon" (was den Namen des Benutzeragenten bedeutet). Dieser Roboter sammelt Mailadressen von verschiedenen Webseiten.

Zeile: RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon

besteht aus drei Teilen:

Richtlinie (Bezeichnung): RewriteCond
Überprüfungszeichenfolge:% {HTTP_USER_AGENT}
Beispielzustand: ^ EmailSiphon

Die Überprüfungszeichenfolge ist eine Servervariable, die in der allgemeinen Form "% {APPLICATION_NAME}" geschrieben werden kann.

Ein Bedingungsbeispiel ist ein regulärer Ausdruck. Für ein vollständigeres Verständnis des Themas betrachten Sie reguläre Ausdrücke als eine Klasse.

Reguläre Ausdrücke

Reguläre Ausdrücke sind ein Mechanismus, mit dem Sie eine Vorlage für eine Zeichenfolge angeben und nach Daten suchen können, die mit dem Muster im angegebenen Text übereinstimmen. Zusätzliche Funktionen zum Arbeiten mit solchen Ausdrücken ermöglichen es Ihnen, die gefundenen Daten in Form eines Arrays von Strings zu erhalten, um im Text der Vorlage einen Ersatz zu geben, die Zeile nach Vorlage aufzuteilen und so weiter. Ihre Hauptfunktion, auf der alle anderen basieren, ist jedoch genau die Funktion des Suchens im Text nach Daten, die dem in der Syntax regulärer Ausdrücke beschriebenen Muster entsprechen.

Reguläre Ausdrücke ähneln einer kleinen, kompakten Programmiersprache mit eigenen Regeln.

Zum Beispiel der reguläre Ausdruck: s/abc/xyz/g

ersetzt die Zeichenfolge "abc" durch die Zeile "xyz" im gesamten Text.

Hier ein kurzer Überblick über die wichtigsten Elemente mit einigen Beispielen:

. (Punkt) - Text (beliebiges Zeichen)
| | - Wechsel (d. h. / abc | def /)
* - Quantifizierer (jede Zahl ist möglich)
^ $ - Ankerlinie
s - operator (Ersetze String1 durch String2)
g - Modifikator (suche den ganzen Text)

Reguläre Ausdrücke werden unter Verwendung dieser Elemente und anderer "gewöhnlicher" Symbole konstruiert. Sie sind keine separate Sprache, sondern werden auf andere Weise verwendet, z. B. Programmiersprachen wie Perl oder PHP sowie Texteditoren (Emacs).

Wenn wir über die Beziehung von regulären Ausdrücken und mod_rewrite sprechen, werden sie in den Direktiven RewriteRule und RewriteCond verwendet.

"^" Bezeichnet den Anfang der Zeile. Daraus folgt, dass der UserAgent mit der Zeile "EmailSiphon" und mit nichts anderem beginnen sollte ("NewEmailSiphon" zum Beispiel würde nicht funktionieren).

Da dieser reguläre Ausdruck jedoch kein "$" - Zeichen (den End-of-Line-Anker) enthält, könnte UserAgent beispielsweise "EmailSiphon2" sein.

Die letzte Zeile unseres Beispiels: RewriteRule ^.*$ - [F]

Es bestimmt, was Sie tun müssen, wenn der Roboter nach einem Zugang fragt.

Der reguläre Ausdruck "^. * $" Bedeutet: "Der Zugriff auf alle Dateien ist verboten".

Der Punkt "." Im regulären Ausdruck ist ein Meta-Zeichen (Wildcard), dh ein beliebiges Zeichen.

"*" Bedeutet, dass die Zeichenfolge beliebig oft vorkommen kann. In diesem Fall wird unabhängig vom Namen der angeforderten Datei ein Fehler generiert.

"EmailSiphon" ist natürlich nicht der einzige Postsammler. Ein weiteres bekanntes Mitglied dieser Familie ist ExtractorPro. Angenommen, wir möchten den Zugriff auf diesen Roboter verweigern. In diesem Fall brauchen wir eine weitere Bedingung.

Nun sieht die .htaccess-Datei folgendermaßen aus: RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR] RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro RewriteRule ^.*$ - [F]

Das dritte Argument [OR] (in der ersten Zeile von RewriteCond) wird "Flag" genannt. Es gibt zwei mögliche Flags:

NC - nicht Groß-und Kleinschreibung.
OR bedeutet "oder die folgende Bedingung".

Mit dem Kontrollkästchen "NC" können Sie den Groß- und Kleinbuchstaben der Stichprobe ignorieren. Zum Beispiel: RewriteCond %{HTTP_USER_AGENT} ^emailsiphon [NC]

Diese Zeile gibt an, dass sowohl "EmailSiphon" als auch "EmailSiphon" als identische Ausdrücke erkannt werden.

Sie können mehrere Kontrollkästchen gleichzeitig verwenden, indem Sie sie durch Kommas trennen. RewriteCond % {HTTP_USER_AGENT} ^EmailSiphon [NC, OR] RewriteCond % {HTTP_USER_AGENT} ^ExtractorPro

Es gibt keine Beschränkungen für die Anzahl der Bedingungen. So können Sie 10, 100, 1000 oder mehr bekannte Mail-Collectors blockieren. Die Definition dieser 1000 Bedingungen ist einfach eine Angelegenheit des Serverladens und der Transparenz der ".htaccess" -Datei.

Im obigen Beispiel wird die globale Variable "HTTP_USER_AGENT" verwendet. Es gibt auch andere Variablen:

REMOTE_HOST
REMOTE_ADDR

Wenn Sie beispielsweise einen Spider von www.site.ru blockieren möchten, können Sie die globale Variable "REMOTE_HOST" auf diese Weise verwenden: RewriteCond % {REMOTE_HOST} ^www.site.ru$ RewriteRule ^.*$ - [F]

Wenn Sie eine bestimmte IP-Adresse blockieren möchten, sieht die Bedingung wie folgt aus: RewriteCond % {REMOTE_ADDR} ^212.37.64.10$ RewriteRule ^.*$ - [F]

Im regulären Ausdruck für die Überprüfung der genauen und vollständigen IP-Adresse müssen Sie den Anfangs- und Endanker verwenden.

Sie können auch den gesamten Bereich ausschließen: RewriteCond %{REMOTE_ADDR} ^212.37.64. RewriteRule ^.*$ - [F] RewriteCond %{REMOTE_ADDR} ^212.37.64. RewriteRule ^.*$ - [F]

Dieses Beispiel zeigt, wie Sie den Bereich der IP-Adressen von 212.37.64.0 bis 212.37.64.255 blockieren können.

Und hier ist ein kleines Puzzle zum Testen des erworbenen Wissens (die Lösung wird im nächsten Teil gegeben): RewriteCond %{REMOTE_ADDR} ^212.37.64 RewriteRule ^.*$ - [F]

Achtung, eine Frage!

Wenn wir im regulären Ausdruck "^ 212.37.64" anstelle von "^ 212.37.64." Schreiben (mit einem Punkt am Ende), wird dies den gleichen Effekt haben und werden die gleichen IP-Adressen ausgeschlossen?

Bisher haben wir eine einfache RewriteRule verwendet, die eine Fehlermeldung generiert. Im dritten Teil der Veröffentlichung werden wir analysieren, wie Sie mit RewriteRule Besucher auf bestimmte Dateien umleiten können.