Bernhard Häussner

Schöne URLs dank mod_rewrite

01.03.2009, 13:17
blogjournal.php?page=2 => blog/journal/2                   (22->14;64%)
blogtags.php?tag=PHP&page=2 => blog/tags/PHP/2             (27->15;56%)
blogentry.php?link=1_Hello_World! => /blog/1_Hello_World!  (33->20;61%)

Eigentlch war das ja schon lange geplant, alle URLs etwas zu verschönern, und sämtliche überflüssige .php?bla=&foo= rauszunehmen. Doch ich hatte immer das Problem, dass die alten URL nicht mehr benutzbar waren. Das ganze habe ich erst versucht mit RewriteRules zu lösen, doch es hat sich herausgestellt, dass es mit PHP leichter zu lösen ist. Wie alles funktioniert will ich hier kurz beschrieben.

Wer den RSS-Feed liest, dem ist vielleicht aufgefallen, dass über Nacht ein paar viele neue Einträge dazu gekommen sind. Diese sind leider gar nicht neu, jedoch da ich das URL-Format ändern musste, werden sie als neu erkannt. Die Seite hat jetzt URL-mäßig einen schönen hierarchischen Aufbau:

/
/about
/blog
/blog/1_Hello_World!
/blog/[...alle Einträge]
/blog/archiv
/blog/feeds
/blog/journal
/blog/journal/1
/blog/journal/2
/blog/journal/[...alle Seiten]
/blog/newcomments
/blog/tags
/blog/tags/PHP
/blog/tags/PHP/1
/blog/tags/PHP/2
/blog/tags/PHP/[...alle Seiten]
/blog/tags/[...alle Tags]
/contact
/projects
/projects/1_Mein_Blog

Das alles wird erstmal von mod_rewrite erledigt. Die URLs oben werden in PHP-verträgliche URLs mit GET-Paramtern usw. umgewandelt. Damit dann aber nicht immer Seiten doppelt erscheinen, musste ich im PHP-Script überprüfen, durch welche URL das Script aufgerufen wurde. Stimmt diese nich mit der kanonischen URL überein, dann leitet das Script mittels eines 301-Redirects direkt an diese weiter. So ist jedes Dokument nur einmal vertreten, was sowol meinen Aufrufstatistiken zuvorkommt, Verwirrung bei Benutzern vorbeugt und Suchmaschinen zufrieden stellt.

Außerdem sind die URLs nicht mehr von der Technik hinter den Kulissen abhängig. Sollte ich also irgendwann die Technik von PHP auf ColdFusion, ASP, Java oder was es alles gibt umstellen, bleiben die URLs (höchstwahrscheinlich) gleich. Sie enthalten keine sinnlosen Dateiendungen usw. Der Prozess funktioniert so:

                           |
                           V
              Request mit beliebiger URL
                           |
                           V
Apaches mod_rewrite wandelt in „normale“ URL mit GET Parametern um
                           |
                           V
    PHP parst die URL und entschiedet, was angezeigt werden soll
                           |
                           V
 PHP vergleicht die kanonische URL zur Anzeige mit der des Requests
             /                          \
            /                            \
    URL ist gleich                   URL ist anders
           |                              |     
           V                              V
  Content wird angezeigt         301 an die richtige URL

Im PHP sieht das Vergleichen dann ungefähr so aus: (z.B. in blog.php)

function setCanURL($root,$url) { // Leiter weiter, falls nötig
	$request_url_withoutHTTP=$_SERVER['REQUEST_URI'];
	$canonical_url_withHTTP=$root.$url;
	$canonical_url_withoutHTTP=removeDomain($root.$url);
	$request_url_withoutHTTP_realspaces=rawurldecode($request_url_withoutHTTP);
	if ($request_url_withoutHTTP_realspaces!=$canonical_url_withoutHTTP) {
			redirect301($canonical_url_withHTTP);
	}
}
function redirect301 ($newurl) { // Macht 301 Weiterleitungen
	header("HTTP/1.1 301 Moved Permanently"); 
	header("Location: $newurl"); 
	header("Connection: close");
	die();
}
function removeDomain($url) { // gibt die URL ohne den Domaine-Teil zurück
	$url=preg_replace('/https?:\/\/([0-9a-zA-Z]+\.){1,}([0-9a-zA-Z]+)\//','/',$url);
	return $url;
}
setCanURL('http://localhost/testseite/','blog');

Man muss natürlich immer irgendwie wissen, wie die kanonische URL aussehen soll. Dann ruft man einfach die Funktion auf. Es ist egal, wie die alte URL aussah! Am besten noch da einbauen, wo die URLs geparst werden bevor die Seite gerendert wird.

Super-Geeky Firefox Quicksearch feature

Die neuen URLs machen auch etwas sehr Zeitsparendes möglich. Empfiehlt sich bei allen Seiten zu machen, die man häufig benutzt (und man kurze URL-Pfade besucht):

In Firefox erstellt man im Bookmark-Manager ein neues Bookmark mit Folgenden Eigenschaften:

  • Adresse: http://bernhardhaeussner.de/%S (Großes S)
  • Schlüsselwort: bh

Allgemein funktioniert das so, dass man z.B. für Suchfunktionen „[Schlüsselwort] [Begriff]“ in die Adresszeile eingeben kann, und so eine Schnelle Suchfunktion hat. Da Firefox aber nichts anderes macht, als %S mit dem Begriff zu ersetzten, kann man das auch für jede andere URL verwenden. So kann ich jetzt durch Eingabe von bh blog direkt zu meinem Blog kommen. Sehr praktisch... Übrigens, benutzt man den Kleinbuchstaben %s wird / zu %2F und ähnliches, wodurch man nicht alle URLs eingeben kann, was jedoch in GET-Parametern wichtig ist („urlencode“).

Super-Geeky Konqueror Quicksearch feature + KRunner

Im Konqueror gibt es auch eine Suche über die Adressleiste, die sich Webkürzel nennt. Man kann diese Webkürzel in Konqueror einrichten im Einrichtungsdialog unter Webkürzel. Dort gibt man dann als Adresse http://bernhardhaeussner.de/\{@} ein und als Kürzel z.B. bh, bxt.

Selbst wenn man Konqueror nicht benutzt, lassen sich diese Kürzel in KRunner benutzten: Ein Tastendruck auf ALT+F2 und die Eingabe von bh:blog führt dann also direkt zu meinem Blog. Ziemlich praktisch und lässt sich auch beliebig erweitern.

Zum Glück ist meine Seite auch noch nicht überall verlinkt, weshalb ich auch sonst nicht viel ändern muss.

Kurze URL http://1-co.de/b/q. Post to twitter

Kommentare

keine





 
Χρόνογραφ
© 2008-2017 by Bernhard Häussner - Impressum - Login
Kurz-Link zu dieser Seite: http://1-co.de/b/q