Suchmaschinenfreundliche URLs

Sprechende, suchmaschinenfreundliche URLs sind nicht erst, seit in der aktuellen c’t eine Einführung von Stefan Karzaunikat zu dem Thema und mod_rewrite zu lesen ist, gefragt. Da bei vielen Projekten keine fertigen Lösungen, wie es sie beispielsweise für Blogsysteme gibt, Anwendung finden, bastelt jeder selber mit den ihm gegeben Fähigkeiten drauf los. Ich möchte hier einige Hinweise auf mögliche Fallstricke und kurze Codeschnipsel, die bei uns funktionieren, zur Verfügung stellen.

Sprechende URLs werden häufig so aufgebaut, dass die ursprüngliche ID, die zur Identifikation des Datensatzes in der Datenbank notwendig ist, weiterhin in der URL verbleibt, zusätzlich aber noch der Titel oder Name des Datensatzes mit reingenommen wird. Zu sehen ist das beispielsweise bei der URL dieses Beitrages: während aus technischer Sicht eine URL wie www.sistrix.de/news/670 völlig ausreichen würde, wurde die Überschrift sowie die Endung „.html“ noch hinzugefügt. Die verwendete PHP-Funktion ist ähnlich wie folgende:

function filename($str) {

    static $from = array('ä',  'á''à''â''å''ö',  'ó''ò''ô''õ''ü',  'ú''ù''û''é''è''ê''í''ì''î''ß',  'ç''Ç''ñ''ý'); 
    static 
$to   = array('ae''a''a''a''a''oe''o''o''o''o''ue''u''u''u''e''e''e''i''i''i''ss''c''c''n''y');

    $str trim(preg_replace("#s+#"' 'preg_replace("#[^a-z0-9.]#"' 'str_replace($from$tostrtolower($str)))));
    
$str str_replace(' ''-'$str);

    return $str;

}

Übliche Sonderzeichen werden zuerst ersetzt (ä->ae), der komplette String wird in Kleinbuchstaben gewandelt und Leerzeichen sowie sonstige Sonderzeichen mit dem Bindestrich als Trennzeichen ersetzt. Um jetzt im PHP-Code der Seite einen Link zu setzen, muss einfach zusätzlich die Funktion aufgerufen werden:

echo '<a href="/news/'.$id.'-'.filename($titel).'.html">'.htmlentities($titel).'</a>';

Nachdem man jetzt schöne URLs hat, muss noch dafür gesorgt werden, dass die Scripte diese auch verstehen. Häufig kommt dabei mod_rewrite zum Einsatz: ein Modul für den verbreiteten Webserver Apache, das internes Umschreiben von URLs anhand vordefinierter regulärer Ausdrücke erlaubt. Hierbei wird allerdings häufig der Fehler gemacht, nur die Id zu übergeben und zu prüfen. Cyb hatte vor einiger Zeit schonmal auf das Problem aufmerksam gemacht, dass so – ob jetzt gut- oder böswillig sei mal dahingestellt – massive Duplicate-Content-Probleme auftreten können. Für oben genanntes Beispiel der URL dieses Beitrages wäre eine mod_rewrite-Anweisung wie diese zu benutzen:

RewriteEngine on
RewriteRule ^news/([0-9]+)-([a-z0-9-.]+).html$ beitrag.php?id=$1&title=$2

Im Script beitrag.php ist nun neben der Prüfung, ob die übergebene Id überhaupt existiert und der Ausgabe des Beitrages auch zu überprüfen, ob der übergebener, also tatsächlich angezeigter Dateiname auch dem entspricht, den die Funktion filename(); erzeugt hätte. Sollte dies nicht so sein, weil jemand falsch verlinkt oder sich der Titel geändert hat, so ist mit einem 301-Redirect auf die korrekte Adresse weiterzuleiten und das Script an dieser Stelle abzubrechen.

Ähnliche Beiträge