Webentwicklung mal ganz einfach!
← Zurück zur Übersicht

SEO: Suchmaschinenfreundliche URLs durch Rewriten in der .htaccess Datei

Publiziert am von Markus Hauser

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

← Zurück zur Übersicht
Eingeordnet in: HTML / CSS PHP / MySQL
Lesezeichen: Permalink zum Beitrag

Kommentare (7)

huleo3

Re: rewrite
Hi Dietmar!

Vorweg: Der korrekte href müsste so lauten:
/dies-und-das?g=i

Und zum Problem: Diese Parameter werden vom Browser mitgeschickt und somit auch in der Adresszeile angezeigt. Wenn diese dort nicht sind, kommen sie auch nie als GET-Parameter beim Server an.

Eine Variante wäre, das ?g=i grundsätzlich weg zu lassen und direkt von der aktiven Seite weg (dies-und-das) zu ermitteln, in welchem Untermenü sich der Besucher befindet. Sollte im Normalfall möglich sein.

Alternativ ließe sich die Url noch dahingehend ändern, dass man den Pfad anpasst auf: /dies-und-das-i
Hier könntest du später im Code grundsätzlich alles nach dem letzten Minus als Hinweis für das offene Menü interpretieren.

Ich würde eher die erste Variante empfehlen, da ich mit dieser auch immer zum Ziel gekommen bin und sich die URLs nicht grundlegend verändern, wie es in der zweiten Variante der Fall wäre.

Dietmar

rewrite
Erstmal danke.

Es funktioniert auf Anhieb

RewriteEngine on
RewriteBase /

#RewriteCond %{REQUEST_URI} !^/+(admin|images)/?
RewriteCond %{REQUEST_URI} !(\..{2,4})$
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?p=$1&%1 [L]

#href=/dies-und-das&g=i

Allerdings wäre es noch besser, wenn &g=i (für das Öffnen der Datensätze der Rubrik i in der Navigation) NICHT in der Adresszeile erscheint. Gibt es dafür eine condition?

D

huleo3

nicht ganz
Diese "Variablen" sind Platzhalter.
Wenn zum Beispiel die Aufgerufene Seite diese ist: foobarblog.net/impressum?foo=bar
Dann ist in der Variable $1 die aufgerufene URL drin. Im Beispiel ist es der Text "impressum".
In %1 ist der QueryString drin, also die weiteren GET-Parameter. Im Beispiel wäre das der Text "foo=bar".

Diese Anfrage würde also aufgrund der Regel index.php?page=$1&%1 umgeschrieben werden auf:
index.php?page=impressum&foo=bar

Im PHP kannst du dann so arbeiten, als wäre genau diese Adresse aufgerufen worden.

Franz Meister

naja...
?page=$1&%1 sagt $1 = Erster Wert vom Link nach .php und %1 = position beim umschreiben richtig?

huleo3

https Zwangregeln
Hallo Marco,
um hier eine vernünftige Aussage treffen zu können, benötige ich deine "https-Zwangregeln". Würde mich interessieren wie diese aussehen, von Grund weg weiß ich jetzt keinen Grund, weshalb das nicht auch mit https funktionieren könnte.

Marco

Das gleiche mit HTPPS
Hallo,

sehr guter beitrag es funktioniert soweit ganz gut. Jedoch funktioniert es nicht mehr wenn ich ein HTTPS zwang Regeln mit in die .htaccess packe. Können Sie es einmal zeigen mit "Only https"?

Thomas

Mehrere Ordner
Danke für diesen Eintrag!
Nur eine kurze Frage: Wie kann man denn Unterordner, wie foobarblog.net/blog/seo-suchmaschinenfreundliche-urls-durch-rewriten-in-der-htaccess-datei-21/
Hinbekommmen?

← Zurück zur Übersicht