Dies ist mein erster Beitrag für den 72dpiClub. Ich sag also erstmal “Hallo!” ![]()
Ich hoffe das ich demnächst mehrfach hier gelesen werden kann und freue mich auf die Dinge die da kommen mögen. Im Grunde werdet ihr von mir wohl eher technische Dinge in Richtung Webentwicklung hören die teilweise auch richtig ins Eingemachte gehen - you’ll see…
Ihr kennt es doch alle, da habt ihr eure schick-flauschige selbst geschrieben PHP-Applikation fertig und irgendwie sehen die URL’s schon ziemlich dreckig aus…
http://www.example.de/index.php?content=news&news_id=15
Bäh, bäh, bäh
Schöner wäre doch http://www.example.de/news/super-tolle-news_15.html, oder?
Der einfachste Weg ist einfach eine Rewrite-Rule für mod_rewrite des Apache-Webservers zu schreiben und damit alle Sorgen los zu sein.
Die Rewrite-Rules werden in einer .htaccess-Datei auf dem Server abgelegt. Der Indianer, vorausgesetzt mod_rewrite ist installiert, sollte beim Aufruf eines Dokuments aus diesem Verzeichniss vorher erst mal kurz in der .htaccess nachschauen ob denn dort irgendwelche Anweisungen für ihn hinterlegt sind.
Eine .htaccess-Datei gilt für alle Unterverzeichnisse sofern sie denn keine eigene .htaccess-Datei haben.
Hier also mal die Lösung für unser obiges Beispiel auf die Schnelle:
RewriteEngine On
RewriteBase /
RewriteRule ^/news/([\w\d-]+)_(\d+)\.html$ index.php?content=news&news_id=$2 [QSA,NC,L]
Die Syntax ist recht einfach, ja ich weiß, sieht nicht so aus
Die erste Zeile sagt Apache das die RewriteEngine eingeschaltet werden soll… wir wollen mod_rewrite benutzen. Die zweite Zeile legt die Basis des Rewrites auf Basis der URL fest. “/” ist also http://www.example.de/.
In der dritten Zeile passiert die eigentliche Zauberei. Mit Hilfe eines regulären Ausdrucks wird die aufgerufene URL überprüft. Trifft der Ausdruck zu wird die Regel angewandt. Mod_rewrite leitet schlußendlich den Aufruf nur intern an euer definiertes Ziel weiter.
Kurzer Ausflug zu regulären Ausdrücken gefällig? Ok ![]()
Mit den runden Klammern () werden Teilausdrücke definiert auf die explizit zugegriffen werden kann. Der Zeichensalat innerhalb der runden Klammern sagt etwas darüber aus welche Zeichen innerhalb des Teilausdrucks erlaubt sind. \w sind alle Wortzeichen (a-z, keine deutschen Umlaute), \d alle Dezimalzeichen und der -. Das + ist ein Multiplier der sagt das die definierten Zeichen in den eckigen Klammern [] beliebig oft aber mindestens einmal vorkommen müssen.
Der reguläre Ausdruck oben sagt also folgendes aus:
Wenn am Anfang der aufgerufen URL von RewriteBase aus gesehen /news/ steht, darauf eine Kombination von Buchstaben, Zahlen und dem ‘-’ folgt die mindestens eine aber beliebig Stellen haben muss, von einem ‘_’ gefolgt wird der wiederum von einer Zahl die beliebig viele aber mindestens eine Stelle haben muss und dann noch durch ein ‘.html’ beendet wird, wende diese Regel an *phew*
Ist gar nicht so schwer wie es sich anhört
Dem Punkt wird übrigens ein \ voran gestellt da dem Punkt eine besondere Bedeutung bei regulären Ausdrücken zukommt. Er steht für ein beliebiges Zeichen. Würde der Punkt nicht “escaped” würde /news/super-newsXhtml auch eine gültige URL sein.
In den eckigen Klammern hinter der Regel gebt ihr mod_rewrite noch ein paar Befehle mit auf dem Weg. QSA steht für QueryStringAppend, es werden also alle weiteren URL-Parameter an die Zieldatei weiter gegeben. NC bedeutet NonCasesensitive, Groß- Kleinschreibung wird also nicht beachtet. L sagt aus das wenn diese Regel zutrifft keine weitere Regel, die eventuell noch folgt, angewandt wird.
Hier empfehle ich euch den mod_rewrite-CheatSheet in dem genau diese Informationen sehr übersichtlich zusammen gefasst sind.
Nur wie kommt jetzt bitteschön unsere News-ID dahin wo sie hin soll? Ganz einfach, durch die Definition der runden Klammern können wir, wie oben erwähnt, auf das Ergebnis des Teilausdrucks zugreifen. Es werden einfach die runden Klammern des Ausdrucks von vorne durchgezählt. Der Teil der unseren News-Titel enthält ist $1, die Zahl die hinter dem “_” steht ist $2.
Es wird also http://www.example.de/news/super-tolle-news_15.html aufgerufen aber in Wirklichkeit landen wir auf http://www.example.de/index.php?content=news&news_id=15.
Das hier beschreibt eine sehr einfache Lösung für dieses Problem und ist an sehr viele Stellen im Web zu finden.
Richtig komfortabel wird es erst wenn man eine allgemeine RewriteRule definiert und auf Applikationseite das Ergebnis parsed und entsprechend reagiert. Ich denke das werde ich euch demnächst mal aufzeigen… das ist dann “the hard way”
Aber vergesst nicht:
“The great thing about mod_rewrite is it gives you all the configurability and flexibility of Sendmail. The downside to mod_rewrite is that it gives you all the configurability and flexibility of Sendmail.”
– Brian Behlendorf, Apache Group
Und hier noch ein paar Links die euch weiterhelfen sollten:
- Apache Dokumentation zu mod_rewrite
- mod_rewrite-CheatSheet
- The Regex-Coach (zum entwickeln regulärer Ausdrücke)














Nice! Welcome o’board! Und gleich mal eben schnell regexe erklärt. Gut der Tipp, dass man weniger komplexe Regular Expressions “sprechen” kann.
Und weiter.
Schön erklärt. Ich bin dann mal auf “the hard way” gespannt
dank u well
[...] waren wir nicht untätig: Say hello to our new Gastschreiberling, dem bereits langjährigen Club-Groupie Patrik. Wir freuen uns sehr, den Club mit ihm bereichern zu [...]