Lesbare URL’s sind mit PHP kein Hexenwerk, wenn man bestimmte Grundlagen versteht und auch anwenden kann.
Dabei muss man eigentlich nur 3 Dinge wissen:
- Was ist eigentlich eine URL
- Wie baue ich eine URL am besten auf
- Wie kann ich eine lesbare URL sinnvoll umleiten
In diesem Tutorial werde ich kurz auf diese einzelnen Punkte eingehen und auch eine Lösung für SEO-Urls darstellen.
1. Was ist eigentlich eine URL
URL steht für Uniform Resource Locator, was nichts anderes bedeutet als einheitlicher Ressourcenanzeiger. Technisch gesehen, verwenden wir in unserem technischem Zeitalter URL’s eigentlich überall, wo ein Computer zum Einsatz kommt. Da unterscheiden sich PC’s nicht von Webseiten oder gar Smartphones.
Ganz simpel gesagt, ist eine URL nichts anderes als eine Pfadangabe, die auf einen bestimmten Ordner oder eine bestimmte Datei zeigt.
Nachteil dieser URL’s ist, das diese immer auf eine existierende Datei (oder ein existierendes Verzeichnis) zielen müssen um zu funktionieren.
file:///K:\xampp\htdocs\ecost\index.php
-> entspricht meinem Windows-Pfad zur Datei index.php
-> im Ordner ecost innerhalb meines XAMPP, auf file:///
-> kann man unter Windows verzichten, da dies das
-> Standard-Schema unter Windows ist
http://Localhost/ecost/index.php
-> entspricht meinem Lokalem Serverpfad zur Datei index.php
-> im Ordner ecost unter localhost (mein Lokaler Webserver)
/www/htdocs/w0000f0f/e-cost.de/index.php
-> entspricht dem Linux-Pfad zur Datei index.php
-> im Webordner des Server
http://e-cost.de/index.php
-> ist das entsprechende Derivat wenn man direkt die URL aufruft.
Eine URL sollte immer funktionieren, auch wenn ich einen Teil davon entferne, wobei hier nicht „mitten drin“ gemeint ist, sondern von hinten nach vorne.
Geht man in Windows ein Verzeichnis nach oben wird mir genau so immer etwas angezeigt, wie unter OSX oder Linux. Das gleiche sollte dann natürlich auch bei Web-Adressen funktionieren.
K:\xampp\htdocs\ecost\index.php -> erreichbar
K:\xampp\htdocs\ecost\ -> erreichbar
K:\xampp\ -> erreichbar
http://www.e-cost.de/user/login -> erreichbar (loginseite)
http://www.e-cost.de/user -> erreichbar (userseite oder alternativ Umleitung auf Login)
http://www.e-cost.de -> erreichbar (klar die Starteite)
2. Wie baue ich eine URL am besten auf
Wenn man mit PHP anfängt, baut man URL’s meist gar nicht auf , sondern legt immer neue Dateien an und verlinkt diese mit HTML direkt.
Nachteil dabei ist, das man hier immer wieder neue Dateien erzeugt, die meist am Anfang immer das gleiche tun (Datenbank verbinden, User-Rechte prüfen, bla und blubb). Und wenn man mal eine Datei umbenennt, musste man sie in allen Dokumenten ändern, weil man dafür keine Logik hatte.
Einige Zeit später stellt man dann fest, GET-Parameter lassen sich ja auch super verwenden.
Nachteil hier: Irgendwann blickt man nicht mehr durch die ganze Struktur durch, da die Url’s nicht lesbar sind.
Ok, es gibt aber noch die schönen URL’s, die ohne Extra-Anhängsel außer evtl. die Pagination
Am Anfang war
<a href="http://www.e-cost.de/login.php">Login</a>
<!--wenn man login.php nun in den ordner user verschiebt muss man das auch überall anpassen-->
Dann kam
<a href="http://www.e-cost.de/index.php?page=login">Login</a>
<!--ok schon besser, aber was ist mit index.php?page=user&action=alluser&sort=username|desc&page=1-->
was wäre wenn:
<a href="http://www.e-cost.de/user/alle/nach_name/desc?page=1">Login</a>
<!--schon viel schöner und ich kann sie lesen-->
3. Wie kann ich eine lesbare URL sinnvoll umleiten
Zum Anfang:
Lass deinen Server keine dinge zweimal machen, die mit einem Durchgang funktionieren würden.
Durch .htaccess erst .php entfernen, um es dann irgendwo wieder anzuhängen ist genau so sinn frei, wie bei Mc Donalds einen Cheeseburger und einen Hamburger zu bestellen, und dann den Käse vom Cheeseburger auf den Hamburger zu legen.
2tens: Lasst die URL’s per Funktion erstellen, keiner hat die Zeit 20 Templates zu ändern, nur weil sich ein Dateiname geändert hat.
RewriteEngine On
RewriteBase /
#Bad Thing
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^(.*)\.php %1 [R,L,NC]
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
<!--don't -->
<a href="user/login.php">Login</a>
<!--do -->
<a href="<?php echo createURL('/user/login');?>">Login</a>
Lets build some pretty urls
Vorbereitung:
Zum Anfang braucht man etwas, um seine URL’s zu verwalten. In meinem Beispiel mach ich dies mit einem simplen Array.
Je nach eigenem können, sollte das ganze aber auch verbessert werden um nachträglich URL’s registrieren zu können (etwa über eine Klasse)
Als Schlüssel wird die eigentliche URL eingetragen, mit diesem fordert ihr auch die URL’s ab.
Folgende Werte stehen innerhalb des Array
‚page‘ ist der die Datei die wir einlesen (includen), wenn die url aufgerufen wird.
‚methode‘ ist obligatorisch und kann z.B. als „tu das innerhalb der Datei“ verwendet werden. Ein Beispiel wäre login und logout, was man evtl mit der gleichen Datei löst.
‚rewrite‘ ist ebenfalls obligatorisch, hier könnt ihr die „schöne“ URL eintragen, die nach vorn sichtbar sein soll.
Natürlich könnt ihr euch noch andere Sachen einfallen lassen.
<?php
$meineURLS = array(
'/'=> array(
'page' => 'startseite.php'
),
'/user'=> array(
'page' => 'user.php',
'rewrite' => '/benutzer'
),
'/user/login'=> array(
'page' => 'user.php',
'methode'=>'login',
'rewrite' => '/benutzer/login'
),
);
/**
* wir haben nun drei Urls registriert
* davon bekommen zwei eine alternative Url (sozusagen eine SEO-URL)
**/
URL's ausgeben:
Dafür basteln wir uns eine Funktion, die lediglich den Schlüssel des Array’s benötigt, und dann eine entsprechende URL zurückgibt.
<?php
/**
* Beispiele
**/
createURL('/'); //gibt / zurück
createURL('/user/login'); //gibt /benutzer/login zurück
createURL('/kartoffel/copter'); //gibt /kartoffel/copter zurück (oder wenn ihr was anderes eingebt eure Fehler-URL)
<?php
function createURL($key = '/') {
/**
* Zugriff auf die Sammlung
**/
global $meineURLS;
/**
* prüfen ob der Schlüssel existiert
**/
if(isset($meineURLS[$key])) {
/**
* Wenn vorhanden, das rewrite zurückgeben
**/
if(isset($meineURLS[$key]['rewrite']) {
return $meineURLS[$key]['rewrite'];
}
return $key;
}
/**
* Standardmässig nur den Schlüssel zurückgeben
* wer will kann bei nicht vorhandenen URL's natürlich
* auch zb error/404 zurückgeben, aber auf ne Fehlerseite
* verlinken ist wahrscheinlich sinnfrei
**/
return $key;
}
URL's umleiten:
Das umleiten der URL’s erfolgt mit 4-5 Zeilen Code innerhalb der .htaccess.
Dabei wird geprüft:
- Ob die aufgerufenen URL ein Verzeichnis ist
- Ob die aufgerufenen URL eine Datei ist
Und wenn nicht wird Sie an die index.php umgeleitet, die von da an alles Routing handelt.
# Redirect on
RewriteEngine on
# Check 1 : is not a dir
RewriteCond %{REQUEST_FILENAME} !-d
# Check 1 : is not a file
RewriteCond %{REQUEST_FILENAME} !-f
# Redirect all to index.php
RewriteRule . index.php [L]
URL's erkennen und verarbeiten:
Nun bekommen wir die URL direkt auf die index.php und können diese über die Server-Var
$_SERVER['REQUEST_URI']
einlesen und verarbeiten. Dabei lassen wir uns die eingetragenen Routerdaten zurückgeben, oder false, wenn die Route nicht gefunden wurde.
Mehr muss man sich nun eigentlich nicht mehr bauen, da man nun schon das Grund-Konstrukt für ordentliche URL’s hat.
Baut man nun alles in eine Index-Datei, kann man direkt mit dem System anfangen und per
findURL();
zb die aktuelle Seite ausgeben oder per
createURL('/user');
auf eine Seite verlinken.
Man kann natürlich auch umleiten.
header("Location: ".createURL('/user/register')); exit;
function findURL()
{
/**
* Zugriff auf die Sammlung
**/
global $meineURLS;
/**
* einlesen der aktuellen aufgerufenen URL
**/
$requestUrl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
/**
* $returnData ist die Variable für die Rückgabe und standardmässig false
**/
$returnData = false;
/**
* durchlaufen der URLS und prüfen ob
* a.) rewrite gleich die Url ist
* b.) der Key gleich die Url ist
**/
foreach ($meineURLS as $URLKey => $urlData) {
if (isset($urlData['rewrite']) && strtolower($urlData['rewrite']) == strtolower($requestUrl)) {
$returnData = $urlData;
$returnData['key'] = $URLKey;
break;
} elseif (strtolower($URLKey) == strtolower($requestUrl)) {
$returnData = $urlData;
$returnData['key'] = $URLKey;
break;
}
}
/**
* und zurück an das System
**/
return $returnData;
}
Weitere Gedanken, Quellcode und sonstiges im Netz
Dies ist, wie gehabt, nur eine Lösung die einen Einblick in mögliche Lösungen geben soll.
Folgendes erhoffe ich mir nach diesem Tutorial:
- Links werden nicht mehr statisch in HTML verbaut
- Links werden logisch eingesetzt (die URL als Ziel- und Aktionsauslöser und $_GET nur noch für Seitenirrelevante Aktionen (Sortieren oder Pagination ) )
- besserer Umgang mit dem Server
Den Quellcode mit kleinen Optimierungen (Nutzung in Unterverzeichnissen) findet ihr in meinem Github-Repo https://github.com/dark-cms/Tutorials im Ordner SimpleURLrewrite. Aber auch hier gilt, nicht nur kopieren, sondern auch lernen.
Andere Alternativen im Internet, die euch das Routing vereinfachen und noch mehr Features haben, findet man mehr als genug im Internet.
Darunter z.B. der Altorouter, diesen nutze ich relative häufig. ebenfalls bietet jedes bekannte PHP-Framework ähnliche Funktionalitäten