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

Modul mod_rewrite Teil 2

Im letzten Kapitel haben wir die Grundlagen des Mod_rewrite-Moduls vorgestellt. In dem betrachteten Beispiel verwendeten wir ein Konstrukt, das wörtlich Folgendes bedeutet: "Wenn jemand versucht, auf die .htaccess-Datei zuzugreifen, wird ein Fehler gemeldet, der darauf hinweist, dass der Zugriff auf die Datei verweigert wird."

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

Wir können die "Regel" mit verschiedenen "Regelbedingungen" einschränken. Die "Regel" wird nur erfüllt, wenn eine Reihe von Bedingungen davor erfüllt sind.

Syntax : Bedingung muss der Regel vorangehen!

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

Der Zweck der ersten drei Einträge wurde im ersten Teil der Veröffentlichung beschrieben. Ihre Funktion besteht darin, die "Umschreibungs-Engine", dh das Modul selbst, zu aktivieren.

In den letzten beiden Zeilen ist der Zugriff auf den Suchroboter "EmailSiphon" (der Name des Benutzeragenten) verboten. Dieser Roboter ist ein Mailadressensammler von verschiedenen Webseiten.

Zeile: RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon

besteht aus drei Teilen:

Direktive (Direktive): RewriteCond
Überprüfungszeichenfolge:% {HTTP_USER_AGENT}
Beispielausdrücke: ^ EmailSiphon

Die Prüfzeichenfolge ist eine Servervariable, die in der allgemeinen Form geschrieben werden kann: "% {NAME_VARIABLE}".

Die Beispielbedingung ist ein regulärer Ausdruck. Für ein umfassenderes Verständnis des Themas sollten Sie reguläre Ausdrücke als Klasse betrachten.

Reguläre Ausdrücke

Reguläre Ausdrücke sind ein Mechanismus zum Festlegen eines Musters für eine Zeichenfolge und zum Suchen nach Daten, die diesem Muster in einem bestimmten Text entsprechen. Zusätzliche Funktionen zum Arbeiten mit solchen Ausdrücken ermöglichen es Ihnen, die gefundenen Daten in Form eines String-Arrays abzurufen, den Text im Muster zu ersetzen, den String im Muster aufzuteilen usw. Ihre Hauptfunktion, auf der alle anderen basieren, ist jedoch genau die Suchfunktion im Datentext, der dem Muster (Muster) entspricht, das in der Syntax für reguläre Ausdrücke beschrieben wird.

Reguläre Ausdrücke sind wie eine kleine, kompakte Programmiersprache mit eigenen Regeln.

Zum Beispiel ein regulärer Ausdruck: s/abc/xyz/g

ersetzt den String "abc" durch den String "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 (beliebige Anzahl ist möglich)
^ $ - Stringanker
s - Operator (String1 durch String2 ersetzen)
g - Modifikator (den gesamten Text durchsuchen)

Reguläre Ausdrücke werden mit diesen Elementen und anderen "gewöhnlichen" Zeichen erstellt. Sie sind keine separate Sprache, sondern werden auf andere Weise verwendet, beispielsweise Programmiersprachen wie Perl oder PHP sowie Texteditoren (Emacs).

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

“^” Zeigt den Beginn einer Zeile an. Daraus folgt, dass UserAgent mit der Zeichenfolge "EmailSiphon" beginnen muss und nichts anderes ("NewEmailSiphon" würde beispielsweise nicht funktionieren).

Da dieser reguläre Ausdruck jedoch nicht das Zeichen "$" (Zeilenende-Anker) enthält, kann UserAgent beispielsweise "EmailSiphon2" sein.

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

legt fest, was zu tun ist, wenn der Roboter den Zugriff anfordert.

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

Der Punkt "." In einem regulären Ausdruck ist ein Metasymbol (Wildcard), das ein beliebiges Zufallssymbol bedeutet.

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

EmailSiphon ist sicherlich nicht der einzige E-Mail-Collector. Ein weiteres bekanntes Mitglied dieser Familie ist "ExtractorPro". Angenommen, wir möchten den Zugriff auf diesen Roboter verweigern. In diesem Fall brauchen wir eine andere Bedingung.

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

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

NC - Fall von Buchstaben ignorieren.
ODER - bedeutet "oder die folgende Bedingung".

Mit der Checkbox NC können Sie die Groß- und Kleinschreibung im gewünschten Muster 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 Flaggen gleichzeitig verwenden, getrennt durch Kommas. RewriteCond % {HTTP_USER_AGENT} ^EmailSiphon [NC, OR] RewriteCond % {HTTP_USER_AGENT} ^ExtractorPro

Es gibt keine Einschränkungen bezüglich der Anzahl der Bedingungen. So können Sie 10, 100, 1000 oder mehr bekannte Mail-Sammler blockieren. Die Definition dieser 1000 Bedingungen ist lediglich eine Frage der Serverlast 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 blockieren möchten, der von www.site.ru stammt, können Sie die globale Variable „REMOTE_HOST“ folgendermaßen verwenden: RewriteCond % {REMOTE_HOST} ^www.site.ru$ RewriteRule ^.*$ - [F]

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

Im regulären Ausdruck zum Überprüfen der genauen und vollständigen IP-Adresse müssen Sie den Start- 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 IP-Adressbereich von 212.37.64.0 bis 212.37.64.255 blockieren.

Aber eine kleine Aufgabe, um das erworbene Wissen zu testen (die Lösung wird im nächsten Teil beschrieben): RewriteCond %{REMOTE_ADDR} ^212.37.64 RewriteRule ^.*$ - [F]

Achtung, Frage!

Wenn wir in den regulären Ausdruck "^ 212.37.64" anstelle von "^ 212.37.64." (Mit einem Punkt am Ende) schreiben, hat dies dieselbe Wirkung und werden die gleichen IP-Adressen ausgeschlossen?

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