HowTo: SEO-friendly urls routen

SEO-Freundliche Urls sind, einfach gesagt, solche Urls, die nicht nur aus dem Script Namen und einer liste abstrakter parameter und IDs bestehen sondern mit lesbaren Bezeichnern arbeiten. Also so, wie die Url, die zu diesem HowTo führt.
Bei Blogs oder CMS lässt sich das relativ leicht mit einem Mapping umsetzen. Zu dem Datensatz wird einfach der lesbare Permalink gespeichert und beim Aufruf des Permalinks eben danach gesucht. Das ist deshalb so einfach zu lösen, weil die auszuführende Aktion immer die selbe ist, nämlich den Content mit dem speziellen Permalink laden und anzeigen.
Haben wir jedoch ein System, bei dem anhand der Url bestimt wird, welche aktion geschehen soll, müssen wir da etwas anders herangehen.

Das Routing

Im Grunde ist routing nichts anderes als eine spezielle Form des Event-Handlings bei dem die Route als Event verwendet wird.
Wir brauchen also mal wieder ein Register bei dem wir anmelden welche Aktion bei welcher Route ausgeführt werden soll und eine Funktion, die anhand der Route die entsprechende Aktion ausführt.

function simple_route($route, $callback=null, $callback_args=array())
{
    static $routes = array();
    if (!is_null($callback))
    {
        $routes[$route][] = array($callback, $callback_args);
    }
    else
    {
        if (isset($routes[$route]))
        {
            foreach ($routes[$route] as $action)
            {
                list($_callback, $_args) = $action;
                call_user_func_array($_callback, $_args);
            }
        }
    }
}

Mit dieser Funktion können wir eine beliebige Anzahl von Aktionen einer bestimmten Route zuordnen und/oder die Aktionen, die einer Route zugeordnet sind der Reihe nach ablaufen lassen.

Ein triviales Beispiel zur Anwendung

// die Funktion home() der Route "/" zuordnen
simple_route('/', 'home');

// die home() Funktion definieren
function home()
{
    echo __FUNCTION__;
}

// Weitere Routen registrieren und definieren...
// ... die Aktuelle Route ermitteln
$current_route = isset($_SERVER['PATH_INFO']) ? $_SERVR['PATH_INFO'] : '/';

// ausführen der registrierten Aktionen
simple_route($current_route);

Warum PATH_INFO?

Laut php dokumentation ist PATH_INFO folgendermaßen definiert:

Enthält, sofern vorhanden, den Teil des Pfadnamens hinter dem Namen des PHP-Skripts, aber vor dem Query-String. Wenn zum Beispiel das aktuelle Skript mittels dem URL http://www.example.com/php/path_info.php/some/stuff?foo=bar aufgerufen wird, würde $_SERVER[‚PATH_INFO‘] /some/stuff enthalten.

Ideal für unsere Zwecke, da wir somit nur genau drei RewriteRules benötigen um den Script-Namen aus der Url zu entfernen und jede beliebige Route mit beliebigem Querystring abdecken zu können.
Die sehen dann so aus:

RewriteEngine On
# wenn Verzeichnis nicht existiert
RewriteCond %{REQUEST_FILENAME} !-d
# wenn Datei nicht existiert
RewriteCond %{REQUEST_FILENAME} !-f
# leite alles auf die index.php um, und hänge den Rest wieder an.
RewriteRule ^(.*)$ index.php/$1 [L]

Als kleiner Bonus sieht die Url auch ohne mod_rewrite – also mit dem Script-Namen dazwischen immer noch recht SEO-Friendly aus, da sie eben ohne Parameter auskommt.

Den Code zu diesem HowTo könnt ihr hier herunterladen

Eine Bemerkung zu “HowTo: SEO-friendly urls routen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.