AA_direction-www_sxc472760_clix.jpg

© clix, sxc.hu

URLs umschreiben mit mod_rewrite

Neue Richtung

Beim Umschreiben von URLs lässt das Apache-Modul Mod_rewrite keine Wünsche offen. Es eignet sich gleichermaßen für einfache Aufgaben und komplexe Szenarien.

Informationen im Internet sind schnellebig: Domainnamen und Pfadangaben ändern sich, alte Meldungen wandern ins Archiv. Kurzlebige Kampagnen-Adressen tun ihr Übriges, um das Chaos zu vergrößern. So verwundert es nicht, dass viele Content-Management-Systeme (CMS) auf ein Apache-Modul namens Mod_rewrite setzen: Es erleichtert die Organisation der Internetadressen erheblich.

Zunächst gilt es, zu klären, ob für Sie das Umschreiben von Adressen überhaupt Sinn ergibt, denn eigentlich ist die Sache ganz einfach: Entweder lässt sich eine Seite unter einer bestimmten URL erreichen und erscheint im Browser, oder es kommt eine Fehlermeldung (404 -- Page not found). Bei einfachen Seiten mag diese Strategie ausreichen, doch bei größeren Webprojekten stößt man damit schnell an Grenzen:

  • Ein neuer Firmenname ändert auch den Domainnamen. Da die alten Adressen aber noch an vielen Stellen stehen, gilt es sie automatisch umzuschreiben.
  • Seiten, die Passwörter abfragen, sollen ausschließlich per SSL-Verschlüsselung erreichbar sein.
  • Sie besitzen mehrere Domains und möchten alle auf eine Seite leiten.
  • Wegen hoher Last betreiben Sie mehrere Webserver, die eingehenden Anfragen sollen bei Bedarf verteilt werden.

Erfahrene Webmaster weisen zurecht darauf hin, dass für alle genannten Beispiele auch anderweitige Lösungen existieren: Domains schalten Sie im Webserver einfach als Alias auf, gesicherte Angebote bieten sie eben nur im HTTPS-Protokoll an, und um die Lastverteilung kümmern sich Caches oder DNS-Round-Robin-Verfahren. Letztendlich steht in jedem HTML-Buch, dass auch das entsprechende Meta-Tag eine Umleitung realisiert.

Doch dank Mod_rewrite decken Sie all diese Möglichkeiten mit einem einzigen, direkt in den Apache-Webserver integrieren und damit sehr leistungsfähigen Modul ab. Zudem meistern Sie damit auch dynamische Umleitungen, was reines HTML nicht mehr leistet. Zahlreiche CMS setzen daher auf das Apache-Modul, beispielsweise um unschöne Adressen wie ?site=2&cat=5&subsite=3&page=27 in ansehnliche Pfade wie /de/docs/faq.html umzuschreiben – was auch der Indizierung und Platzierung bei Suchmaschinen zugute kommt.

Testumgebung

Unser Testsystem besteht aus der aktuellen LTS-Version von Ubuntu 10.04 "Lucid Lynx", auf dem wir Apache mittels sudo apt-get install apache2-suexec apache2-mpm-prefork einrichten. Die Software enthält bereits das Modul mod_rewrite. Wir aktivieren es mittels des Kommandozeilenaufrufs sudo a2enmod rewrite und starten anschließend den Webserver mit sudo apache2ctl restart neu.

Konfiguration

Unabhängig davon, ob Sie eine bestehende Installation mit Mod_rewrite ergänzen oder den Webserver frisch aufsetzen – als Erstes gilt es, das Modul über die Direktive RewriteEngine on in der Apache-Konfiguration zu aktivieren. Anstatt das global für den gesamten Webserver zu tun, versehen Sie nur diejenigen Hosts damit, die diese Umleitung auch in Anspruch nehmen.

Dazu öffnen Sie die entsprechende Konfigurationsdatei im Verzeichnis /etc/apache2/sites-enabled und fügen die Direktive ein (Listing 1). Nach jeder Änderung am virtuellen Host gilt es, Apache neu zu starten, damit er die Änderungen übernimmt; bei der Variante mittels .htaccess entfällt dieser Schritt. Die Vor- und Nachteile beider Varianten erklärt der Kasten ".htaccess oder Virtual Host?".

Listing 1

<VirtualHost *:80>
ServerName meinefirma.tld
RewriteEngine on
</VirtualHost>
.htaccess

oder Virtual Host?

Die Mod_rewrite-Regeln legen Sie auf zwei verschiedene Arten an: Zum einen im entsprechenden Virtual-Host-Abschnitt der Konfigurationsdatei von Apache, zum anderen in den so genannten .htaccess-Dateien. Die letztgenannte Variante bietet den Vorteil, dass sie auch normalen Anwendern ohne Zugriff auf die Apache-Konfiguration zur Verfügung steht. Allerdings arbeitet diese Methode nicht nur langsamer, sondern birgt auch die Gefahr, dass ein Anwender mit einer unbedachten Regel den kompletten Webserver lahm legt. Es empfiehlt sich deswegen, die Regeln direkt in der Virtual-Host-Direktive anzulegen.

Eigene Regeln

Mod_rewrite macht nichts anderes, als Adressen anhand bestimmter Regeln umzuschreiben. Dazu bringt es eine Vielzahl von Direktiven mit, die das Apache-Handbuch komplett dokumentiert [1]. Die wesentlichen Funktionen bildet das Modul mit den Funktionen RewriteRule und RewriteCond ab. Erstere regelt, in welcher Art das Modul die Adressen umschreibt, letztere besagt, wann der Mechanismus greift. Erst wenn die in RewriteCond definierten Regeln erfüllt sind, erfolgt das Umschreiben mittels RewriteRule. Bedingungen legen Sie wahlweise einzeln oder kumulativ fest. Ein Beispiel:

RewriteRule ^/weihnachten2010\.html$ /ostern2011.html

Diese Zeile leitet den Aufruf der Seite /weihnachten2010.html, die hier beispielhaft für die Weihnachtskampagne eines Versandhauses steht, auf die der Jahreszeit angepasste Seite für das Ostergeschäft weiter, /ostern2011.html. Die Zieladresse ist dabei kein absoluter Pfad im Dateisystem sondern die URL, wie Sie sie auch im Browser eingeben würden. Rufen Sie jetzt die weihnachtliche Seite auf, so leitet Apache die Anfrage um – für den Besucher transparent: Er sieht in der Adresszeile nach wie vor die Weihnachts-URL.

Für manche Umleitung mag das wünschenswert sein, doch gerade wenn Sie Adressen dauerhaft ändern, weisen Sie den Anwender und insbesondere Suchmaschinen besser darauf hin. Fügen Sie dazu den Parameter R=permanent in eckigen Klammern hinzu, der dann den Status-Code 301 auslöst:

RewriteRule ^/weihnachten2010\.html$ ostern2011.html [R=permanent]

Wollen Sie nicht auf ein internes Angebot, sondern auf die Seite eines Dritten weiterleiten, so geben Sie die komplette URL an – in diesem Fall sieht der Besucher die Umleitung aber in jedem Fall:

RewriteRule ^/weihnachten2010\.html$ http://meineandereseite.tld/ostern2011.html [R=permanent]

Beachten Sie die Schreibweise von Quelle und Ziel. Die bisherigen Beispiele geben als Zieladresse stets eine normale absolute oder relative URL an – die Quelle jedoch als sogenannten regulären Ausdruck. Diesen umschließen die Zeichen ^ (Hochkomma) und $ (Dollar). Als weitere Besonderheit gilt es, in der Adresse vorkommende Punkte mit einem \ (Backslash) zu maskieren (auch "escapen" genannt). Das mutet zunächst umständlich an, hat aber einen guten Grund: Reguläre Ausdrücke verwenden auch Platzhalter, die eine Vielzahl von Fällen auf einmal abdecken. Ein Beispiel:

RewriteRule ^/[^/]*2010\.html$ /ostern2011.html [R=permanent]

Mit dieser Regel schreiben Sie sämtliche Adressen um, in denen 2010.html vorkommt und die im Stammverzeichnis der Domain liegen. [^/]* steht als regulärer Ausdruck für eine beliebige Anzahl von Zeichen, jedoch nicht den Backslash. Konkret heißt das, die Regel sowohl /januar2010.html abgedeckt, also auch /januar2010.htm, nicht jedoch /januar2010.htmlx, denn den Ausdruck schließt ein Dollarzeichen ab. Allerdings zählt auch /2010.html als Treffer, denn [^/]* bedeutet auch, dass gar kein Zeichen vorkommt. Um zumindest ein einziges Zeichen zu verlangen, und sowohl html als auch htm als Endung zuzulassen, ersetzen Sie den Stern durch ein Plus, und verwenden .? als Platzhalter, was so viel bedeutet wie "kein oder genau ein Zeichen":

RewriteRule ^/[^/]+2010\.htm.?$ /ostern2011.html [R=permanent]

Jetzt sehen Sie auch den Grund, warum vor Punkten der Backslash steht: Während Sie mit \. den Punkt als Bestandteil der Domain bezeichnen, steht .? als Platzhalter und nicht für einen Punkt gefolgt von einem Fragezeichen.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Kommentare
Weitergegebene Informationen
Marc (unangemeldet), Freitag, 19. Dezember 2014 04:52:56
Ein/Ausklappen

Hallo Herr Effenberger,

vielen Dank erst einmal für den tollen Artikel!
Das Prinzip mit dem Umschreiben habe ich verstanden, und in der Praxis funktioniert das auch so weit. Jedoch habe ich einen Fall, der mit nicht ganz einleuchtet. Folgende RewriteRule wird bei WordPress verwendet und funktioniert auch:

RewriteRule . /index.php [L]

Hier wird quasi alles nach index.php umgeschrieben und trotzdem schafft es das PHP Skript, den richtigen Artikel anzuzeigen - ohne dass zumindest offensichtlich Query-Parameter oder andere Informationen an index.php übergeben werden.

Ein Test mit einer RewriteRule, die auf eine externe URL umschreibt, auf der mit netcat ein simpler TCP-Server lauscht ergab, dass auch keine HTTP-Referer-Header oder ähnliches mitgegeben werden, die dem PHP Skript mitteilen könnten, welcher Artikel ursprünglich angefragt wurde.

Aber wie gesagt - es funktioniert - nur wie?


Mit freundlichen Grüßen

Marc A.


Bewertung: 226 Punkte bei 54 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
-
Re: Weitergegebene Informationen
Andreas Bohle, Donnerstag, 08. Januar 2015 15:15:41
Ein/Ausklappen

Hallo Marc, soweit ich das im Netz recherchieren konnte, verhindert das [L] einen Loop, also eine Endlosschleife, bei der index.php immer wieder auf sich selbst verweist. Im Netz gibt es zu der Frage, wie das bei WordPress funktioniert, die Antwort auf folgender Seite:

http://stackoverflow.com/qu...n-someone-explain-how-it-works

Demzufolge gehören noch zwei weitere Anweisungen zu dem Block.

Beste Grüße
Andreas


Bewertung: 268 Punkte bei 48 Stimmen.
Den Beitrag bewerten: Gut / Schlecht

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Broadcom Adapter 802.11n nachinstallieren
Thomas Mengel, 31.10.2017 20:06, 2 Antworten
Hallo, kann man nachträglich auf einer Liveversion, MX Linux auf einem USB-Stick, nachträglich...
RUN fsck Manually / Stromausfall
Arno Krug, 29.10.2017 12:51, 1 Antworten
Hallo, nach Absturz des Rechners aufgrund fehlendem Stroms startet Linux nicht mehr wie gewohn...
source.list öffnet sich nicht
sebastian reimann, 27.10.2017 09:32, 2 Antworten
hallo Zusammen Ich habe das problem Das ich meine source.list nicht öffnen kann weiß vlt jemman...
Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 6 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...