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

Modul mod_rewrite Teil 3

In den beiden vorangegangenen Abschnitten haben wir uns mit den Grundlagen der "Rewrite Rules" der URL und den "Rules Conditions" vertraut gemacht. Lassen Sie mich zwei Beispiele vorschlagen, die komplexere Anwendungen veranschaulichen.

Das erste Beispiel beschäftigt sich mit dynamischen Seiten, und das zweite Beispiel zeigt die Möglichkeiten, ".txt" -Dateien und das Produkt verschiedener Aktionen auf ihnen aufzurufen.

Angenommen, wir haben einen virtuellen Laden für den Verkauf einiger Waren. Kunden verweisen auf Produktbeschreibungen über das Skript:

http://www.yoursite.com/cgi-bin/shop.cgi?product1
http://www.yoursite.com/cgi-bin/shop.cgi?product2
http://www.yoursite.com/cgi-bin/shop.cgi?product3

Diese Adressen werden auf den meisten Seiten der Website als Links dargestellt.

Und jetzt möchten wir sagen, dass Sie sich entschieden haben, eine Website für die Indexierung in den Suchmaschinen hinzuzufügen. Dann erwartet Sie ein kleines Problem - nicht alle Suchmaschinen akzeptieren, verstehen und indizieren URLs, die das Symbol "?" Enthalten.

Natürlicher und akzeptabler für die Suchmaschine ist die URL des Formulars:

http://www.yoursite.com/cgi-bin/shop.cgi/product1

In diesem Fall wird das Symbol "?" Durch "/" ersetzt.

Noch bequemer URL in Bezug auf die Suchmaschine wird wie folgt aussehen:

http://www.yoursite.com/shop/product1

Für die Suchmaschine ist "shop" jetzt gleichsam ein Verzeichnis mit den Produkten product1, product2 usw.

Wenn der Benutzer von der Suchergebnisseite in der Suchmaschine diesem Link folgt, sollte dieser Link in einen Link umgewandelt werden: shop.cgi? Product1.

Um diesen Effekt zu erreichen, können Sie mod_rewrite mit dem folgenden Konstrukt in der .htaccess-Datei verwenden: RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2

Die Variablen $ 1 und $ 2 bilden die sogenannten "Rückreferenzen". Sie sind mit Textgruppen verknüpft. Die aufgerufene URL ist in Teile aufgeteilt. Alles, was vor dem "Shop" ist, plus alles, was hinter "shop /" steht, wird in diesen zwei Variablen definiert und gespeichert: $ 1 und $ 2.

Bis zu diesem Punkt haben unsere Beispiele "Regeln" des Typs verwendet: RewriteRule ^.htaccess*$ - [F]

Allerdings haben wir das echte Umschreiben von URLs noch nicht erreicht, in dem Sinne, dass eine URL den Besucher zu einem anderen umleiten sollte.

Für unseren Rekord wie: RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2 die allgemeine Syntax:

RewriteRule currentURL rewritableURL

Wie Sie sehen, führt diese Anweisung ein echtes "Überschreiben" der URL-Adresse durch.

Zusätzlich zu den Einträgen in der .htaccess-Datei müssen Sie auch alle Links auf der Website ersetzen, die das Format "cgi-bin / shop.cgi? Product" haben, mit Links wie "shop / product"

Jetzt, da die Suchmaschine eine Seite mit ähnlichen Links findet, indiziert sie die Site ohne sichtbare Probleme.

Auf diese Weise können Sie eine rein dynamische Site in eine Site mit einer statischen Struktur verwandeln, die offensichtlich bei der Indizierung durch verschiedene lahme Maschinen von Vorteil ist. Achten Sie auf die Art der URLs auf dieser Website. Darüber hinaus haben sie eine leicht lesbare Struktur für eine Person - CNC (Human-to-Understanding URL). Aber wir werden darüber in einem anderen Artikel sprechen.

In unserem zweiten Beispiel werden wir besprechen, wie Anforderungen für ".txt" -Dateien an das Skript des Programms weitergeleitet werden.

Viele Hosting-Provider, die mit Apache arbeiten, stellen Protokolldateien in einem gemeinsamen Format bereit. Dies bedeutet, dass sie Felder nicht mit verweisenden Seiten und Benutzeragenten verknüpfen.

In Bezug auf Anfragen an die Datei "robots.txt" ist es jedoch vorzuziehen, Zugriff auf all diese Daten zu haben, um mehr Informationen über den Besuch von Suchmaschinen zu haben, als nur ihre IP-Adressen zu kennen. Um dies zu formalisieren, sollten die folgenden Einträge in .htaccess sein: RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteRule ^robots.txt$ /text.cgi?%{REQUEST_URI}

Wenn wir jetzt die Datei "robots.txt" anfordern, leitet unsere RewriteRule den Besucher (Roboter) zur Text.cgi-Anfrage-Engine um. Außerdem wird die Variable an das Skript übergeben, das entsprechend Ihren Anforderungen verarbeitet wird. "REQUEST_URI" gibt den Namen der angeforderten Datei an. In diesem Beispiel ist es "robots.txt". Das Skript liest den Inhalt von "robots.txt" und sendet es an einen Webbrowser oder Suchmaschinenroboter. So können wir Besuchertreffer zählen und ihre Logfiles durchführen.

Zu diesem Zweck verwendet das Skript die Umgebungsvariablen $ ENV {'HTTP_USER_AGENT'} usw. Dies stellt sicher, dass alle erforderlichen Informationen erhalten werden. Hier ist die Quelle für das oben erwähnte cgi-Skript: #!/usr/bin/perl # If required, adjust line above to point to Perl 5. ################################# # (c) Copyright 2000 by fantomaster.com # # All rights reserved. # ################################# $stats_dir = "stats"; $log_file = "stats.log"; $remote_host = "$ENV{'REMOTE_HOST'}"; $remote_addr = "$ENV{'REMOTE_ADDR'}"; $user_agent = "$ENV{'HTTP_USER_AGENT'}"; $referer = "$ENV{'HTTP_REFERER'}"; $document_name = "$ENV{'QUERY_STRING'}"; open (FILE, "robots.txt"); @TEXT = ; close (FILE); &get_date; &log_hits ("$date $remote_host $remote_addr $user_agent $referer $document_name "); print "Content-type: text/plain "; print @TEXT; exit; sub get_date { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(); $mon++; $sec = sprintf ("%02d", $sec); $min = sprintf ("%02d", $min); $hour = sprintf ("%02d", $hour); $mday = sprintf ("%02d", $mday); $mon = sprintf ("%02d", $mon); $year = scalar localtime; $year =~ s/.*?(d{4})/$1/; $date="$year-$mon-$mday, $hour:$min:$sec"; } sub log_hits { open (HITS, ">>$stats_dir/$log_file"); print HITS @_; close (HITS); } #!/usr/bin/perl # If required, adjust line above to point to Perl 5. ################################# # (c) Copyright 2000 by fantomaster.com # # All rights reserved. # ################################# $stats_dir = "stats"; $log_file = "stats.log"; $remote_host = "$ENV{'REMOTE_HOST'}"; $remote_addr = "$ENV{'REMOTE_ADDR'}"; $user_agent = "$ENV{'HTTP_USER_AGENT'}"; $referer = "$ENV{'HTTP_REFERER'}"; $document_name = "$ENV{'QUERY_STRING'}"; open (FILE, "robots.txt"); @TEXT = ; close (FILE); &get_date; &log_hits ("$date $remote_host $remote_addr $user_agent $referer $document_name "); print "Content-type: text/plain "; print @TEXT; exit; sub get_date { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(); $mon++; $sec = sprintf ("%02d", $sec); $min = sprintf ("%02d", $min); $hour = sprintf ("%02d", $hour); $mday = sprintf ("%02d", $mday); $mon = sprintf ("%02d", $mon); $year = scalar localtime; $year =~ s/.*?(d{4})/$1/; $date="$year-$mon-$mday, $hour:$min:$sec"; } sub log_hits { open (HITS, ">>$stats_dir/$log_file"); print HITS @_; close (HITS); }

Laden Sie die Datei mit diesem Inhalt in das Root- oder DocumentRoot-Verzeichnis des Servers herunter und legen Sie die Berechtigungen für die Datei (chmod) 755 fest. Erstellen Sie dann das Verzeichnis "stats".

Wenn die Einstellungen Ihres Servers das Ausführen von CGI-Skripts im Hauptverzeichnis (DocumentRoot) nicht zulassen, versuchen Sie die folgende Option: RewriteRule ^robots.txt$ /cgi-bin/text.cgi?%{REQUEST_URI}

Beachten Sie, dass in diesem Fall die Pfade im Skriptcode geändert werden müssen!

Schließlich ist hier die Lösung für das Problem im vorherigen Teil dieser Veröffentlichung: RewriteCond %{REMOTE_ADDR} ^212.37.64 RewriteRule ^.*$ - [F]

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?

Der reguläre Ausdruck ^ 212.37.64 erfüllt und ist anwendbar auf folgende Zeilen:

212.37.64
212.37.640
212.37.641
212.37.64a
212.37.64abc
212.37.64.12
212.37.642.12

Daher kann der letzten Ziffer "4" eine beliebige Zeichenkette folgen. Der maximale Wert von IP ist jedoch die Adresse 255.255.255.255 - was bedeutet, dass zum Beispiel 212.37.642.12 eine falsche (ungültige) IP ist. Die einzige gültige IP in der obigen Liste ist 212.37.64.12!

Fortsetzung folgt...