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

Modul Mod_rewrite h.3

In den beiden vorherigen Teilen lernten wir die Grundlagen der "Umschreibungsregeln" der URL und der "Regeln". Lassen Sie mich zwei Beispiele erläutern, die komplexere Anwendungen illustrieren.

Das erste Beispiel behandelt dynamische Seiten und das zweite Beispiel zeigt die Möglichkeit, die ".txt" -Dateien aufzurufen und verschiedene Aktionen auszuführen.

Angenommen, wir haben ein virtuelles Geschäft, das einige Waren verkauft. Kunden greifen auf Produktbeschreibungen über ein Skript zu:

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 zur Verfügung gestellt.

Angenommen, Sie möchten eine Website für die Indexierung in Suchmaschinen hinzufügen. Es gibt ein kleines Problem, das auf Sie wartet - nicht alle Suchmaschinen akzeptieren, verstehen und indexieren URLs, die das Symbol "?" Enthalten.

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

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

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

Noch komfortablere URL aus der Sicht der Suchmaschine wird sein:

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

Für die Suchmaschine ist "shop" gleichsam ein Verzeichnis mit den Waren 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 erzielen, 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 dem "Shop /" steht, wird in diesen zwei Variablen bestimmt und gespeichert: $ 1 und $ 2.

Bis zu diesem Punkt verwendeten unsere Beispiele "Regeln" des Typs: 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 RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2 : RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2 lautet die allgemeine Syntax:

RewriteRule currentURL rewritableURL

Wie Sie sehen, führt diese Anweisung ein gültiges "Umschreiben" der URL-Adresse durch.

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

Wenn die Suchmaschine nun 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, was bei der Indizierung durch verschiedene Subscale-Maschinen offensichtlich nützlich sein wird. Achten Sie auf die Art der URL-Adressen auf dieser Website. Darüber hinaus haben sie eine leicht lesbare Struktur für Menschen - eine CNC (menschenlesbare URL). Aber wir werden darüber in einem anderen Artikel sprechen.

In unserem zweiten Beispiel wird erläutert, wie Anforderungen für ".txt" -Dateien an ein Programmskript weitergeleitet werden.

Viele Apache-Hosting-Provider stellen Protokolldateien in einem gemeinsamen Format bereit. Dies bedeutet, dass sie keine Felder mit verweisenden Seiten und Benutzeragenten enthalten.

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

Wenn wir nun die Datei "robots.txt" anfordern, leitet unsere RewriteRule den Besucher (Roboter) an die Skript-Verarbeitungsanforderungen text.cgi weiter. Außerdem wird die Variable an das Skript übergeben, das entsprechend Ihren Anforderungen verarbeitet wird. "REQUEST_URI" definiert den Namen der angeforderten Datei. In diesem Beispiel ist dies "robots.txt". Das Skript liest den Inhalt der "robots.txt" und sendet es an einen Webbrowser oder Suchmaschinenroboter. So können wir Besuchertreffer zählen und unsere Protokolldateien pflegen.

Zu diesem Zweck verwendet das Skript die Umgebungsvariablen "$ ENV {'HTTP_USER_AGENT'}" usw. Dies liefert alle erforderlichen Informationen. Hier ist der Quelltext 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-Serververzeichnis hoch und legen Sie die Berechtigungen für die Datei (chmod) 755 fest. Erstellen Sie dann das Verzeichnis "stats".

Wenn die Einstellungen Ihres Servers es nicht erlauben, cgi-scripts im Hauptverzeichnis (DocumentRoot) auszuführen, versuchen Sie die folgende Option: RewriteRule ^robots.txt$ /cgi-bin/text.cgi?%{REQUEST_URI}

Bitte beachten Sie, dass in diesem Fall die Pfade im Script-Code 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 es den gleichen Effekt haben und werden die gleichen IP-Adressen ausgeschlossen?

Der reguläre Ausdruck ^ 212.37.64 erfüllt und gilt für die folgenden 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 die letzte Ziffer "4" von einer beliebigen Zeichenkette begleitet sein. Der maximale IP-Wert ist jedoch die Adresse 255.255.255.255. Dies bedeutet, dass beispielsweise 212.37.642.12 eine falsche (ungültige) IP-Adresse ist. Die einzige gültige IP in der obigen Liste ist 212.37.64.12!

Fortsetzung folgt...