SEO: Suchmaschinenfreundliche URLs durch Rewriten in der .htaccess Datei
Wenn man Projekte mit PHP umsetzt, in welchen sich die einzelnen Seiten des Webs über einen GET-Parameter unterscheiden, sehen die URLs (Adresspfade) oft unschön aus. Ein sehr gängiges Beispiel einer internen Verlinkung ist "index.php?page=kontakt". Wenn man da drauf klickt, übermittelt man einen GET-Parameter names page mit dem Wert kontakt und PHP kann darauf hin die korrekte Kontaktseite laden. Soweit ist alles in Ordnung, gegen diese Technik ist auch nichts zu sagen. Allerdings leidet die Optik der Adressen etwas. Und noch viel wichtiger ist: Sie sind nicht suchmaschinenfreundlich. Wie man solche suchmaschinenfreundlichen Verlinkungen (auch: SEF URLs, Search Engine Friendly URLs) erstellt, erkläre ich euch in diesem Beitrag.
Die Technik
Der Apache Webserver unterstützt im Normalfall in jedem Ordner eine Datei namens ".htaccess". Darin kann man unter Anderem Regeln für die RewriteEngine erstellen, welche es erlaubt, unechte Pfade in echte Pfade umzuwandeln. Ein kleines Beispiel macht es deutlicher. Im HTML unserer Seite verlinken wir künftig nur mehr auf "/kontakt". Im Hauptordner unseres Projekts erstellen wir eine .htaccess Datei mit einer Regel, die einen solchen Pfad umwandelt auf "index.php?page=kontakt". Das läuft dann intern im Apache ab und ist nicht zu sehen. Das Ergebnis ist: In das href-Attribut von Links können wir den schönen Pfad setzen, der Benutzer sowie die Suchmaschinen sehen nur mehr diesen. Über das rewriten in der .htaccess Datei gaukeln wir allerdings dem PHP-Skript dahinter vor, dass die Seite "index.php?page=kontakt" aufgerufen wurde und somit werden die GET-Parameter ans PHP mitgesendet wie zuvor. Das hat zur Folge, dass wir an der PHP-Logik nichts verändern müssen.
Der Code
Im HTML
Die bisherigen "index.php?page=kontakt" Pfade müssen umgeschrieben werden auf folgendes Format.
<a href="/kontakt">Kontakt</a>
Die .htaccess Datei
Der folgende Inhalt gehört in die .htaccess Datei. Die zeilenweise Aufschlüsselung folgt nach dem Code.
RewriteEngine on
RewriteBase /www
RewriteCond %{REQUEST_URI} !^/+(admin|images)/?
RewriteCond %{REQUEST_URI} !(\..{2,4})$
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?page=$1&%1 [L]
Zeile 1: Die RewriteEngine des Apache wird eingeschaltet. Dies ermöglicht uns erst die suchmaschinenfreundlichen, unechten Pfade zu verwenden.
Zeile 3: Die RewriteBase stellt den Unterordner der Domain ein, in welchem das Rewriten stattfinden soll. Ob dies benötigt wird hängt vom Webhost ab und muss schlichtweg ausprobiert werden. In lokalen Umgebungen kann es allerdings notwendig sein, wenn das Web als Unterordner von "localhost" geführt wird.
Zeile 5: Wenn für gewisse echte Unterordner das Rewriten deaktiviert werden soll, kann man eine RewriteCond (= Rewrite Condition, Bedingung für die nächste RewriteRule) erstellen. Diese hier würde das Rewriten für die Unterordner "admin" und "images" deaktivieren, sodass wie üblich darauf zugegriffen werden kann.
Zeile 6: Diese Rewrite Condition ist dafür zuständig, dass alle Aufrufe an Dateien mit Dateiendung (wie zum Beispiel .css und .js Dateien, Bilder usw.) nicht rewritet werden. Ohne dieser Zeile würden die Aufrufe an diese Dateien immer in die "index.php" geleitet und könnten somit nicht mehr angezeigt werden.
Zeile 7: Diese Rewrite Condition ist keine Einschränkung, sondern dient um eventuelle GET-Parameter weiter durchzuschleifen, damit diese trotz der neuen URLs funktionieren.
Zeile 8: Die RewriteRule löst das eigentliche weiterleiten aus. Diese hier schnappt sich alle Anfragen die nicht durch vorige Conditions ausgenommen wurden und leitet sie in die index.php mit dem GET-Parameter "page". Dieser Paramter enthält dann alles aus der URL, was nach der Domain steht.
Zwei Beispielaufrufe
Beispiel 1: Das funktionierende Rewriten
Ein User klickt in der Navigation auf Impressum, dies leitet ihn weiter auf die Adresse "http://foobarblog.net/impressum". Wenn die Anfrage beim Server ankommt, startet das Rewriten. Dadurch verhält es sich so, als wäre die Adresse "http://foobarblog.net/index.php?page=impressum" aufgerufen worden. Dies geschieht unsichtbar im Hintergrund.
Beispiel 2: Ein ausgenommener Aufruf eines Bildes
Am Server wird das Bild "http://foobarblog.net/header.jpg" abgerufen. Auch dieser Aufruf (wie alle weiteren Dateien mit Dateiendung) wandern erst in die .htaccess Datei und somit auch durch unsere Rewrite-Regeln. In Zeile 6 unserer .htaccess Datei nehmen wir allerdings alle Aufrufe aus, welche eine Dateiendung haben. Somit wandert dieser Aufruf nicht automatisch in die index.php, da die RewriteRule in diesem Fall ignoriert wird. Somit wird das Bild ganz normal ausgeliefert und der User sieht es am Bildschirm.
Schlusswort
Das Rewriten macht das ganze Hantieren mit Links und Adressen nicht gerade einfacher, allerdings freuen sich die Suchmaschinen außerordentlich darüber. Dies wiederum freut den Webseitenbetreiber und -inhaber, weshalb ich dennoch empfehle, das Rewriten in einem ruhigen Moment auszuprobieren. Viel Spaß beim Tüfteln!
Markus