Aaron Fischer Ingenieur, Vater, Heimwerker, Problemlöser

17 März, 2008

Legacy-Systeme mit mod_rewrite fixen

Netzkultur

Altanwendungen zu betreuen ist oft nicht einfach, bei Webanwendungen wird es meist noch umständlicher und niemand macht es gerne. Wenn man beispielsweise die Blogsoftware wechselt, auf ein CMS-System wechselt oder gar die neue Version selbst programmiert hat, stimmen die alten URLs nicht mehr. Das ist besonders ärgerlich, wenn die alte Seite viele Backlinks hatte, die nach dem Umzug nicht mehr funktionieren.

Ein Beispiel: In der alten Anwendung sahen die URLs so aus: http://example.com/blog/index.php?id=123. In der neuen Software sieht die URL, die zum gleichen Content führt, anders aus: http://example.com/123-meine-neue-webseite.

Was also tun? Es hinnehmen? Das alte System parallel weiterlaufen lassen, nur damit die Links noch stimmen? Zu umständlich. Aktuelle Webserver bieten die Möglichkeit an, URLs mit Hife von mod_rewrite intern umzuschreiben. Dieses Feature wird meistens dafür verwendet um die URLs einfacher, verständlicher und sicherer zu machen.

Diese Funktionalität kann man auch dafür verwenden um das Altsystem zu faken. Hier eine Lösung in Lighttpd für das obige Beispiel (Voraussetzung hierfür ist natürlich, das die neue Blogsoftware die Seite nur anhand der ID auswählt und nicht zusätzlich am Seitennamen):

url.rewrite-once(
    "/blog/index\\.php\\?id=([0-9]+)." => "/$1-old-url")

Alles was in der Form /blog/index.php?id=xxx am Webserver eintrifft wird auf das neue URL-Schema umgeformt. So erhält man seine alten URLs weiter am Leben, ohne das sie weiter existieren müssen.

Was aber tun wenn man keine Verknüpfung zwischen alter und neuer URL herstellen kann? Dies passiert beispielsweise dann, wenn man im neuen System die Seite nicht anhand der ID sondern anhand des Seitennamens auswählt (/blog/meine-neue-webseite z.B.). Hier führt kein Weg an einem kleinen Hilfsscript vorbei das die fehlende Verbindung wieder herstellt. Im obigen Beispiel müssten wir eine Beziehung zwischen der ID und des Seitennamens herstellen. Ein einfaches PHP-Script könnt so aussehen:

$row = $sql->query(
    "SELECT url_name FROM entries WHERE id=?",
    $_GET["id"]);
header("LOCATION: /blog/".$row->url_name);

Das kleine Script sucht den Seitennamen anhand der ID raus und leitet dann an diese weiter. Die Regel für mod_rewrite würde dann so aussehen:

url.rewrite-once(
    "/blog/index\\.php\\?id=([0-9]+)." => "/legacy.php?id=$1")

Hat die neue Seite den Content der alten Seite nicht mehr, kann man diese Technik auch dazu nutzen um die alten URLs auf eine Übersichtsseite oder eine spezielle existiert nicht mehr-Seite umzuleiten.