SEO & Online-Marketing

PHP und .htaccess: Lesbare URLs mit variablen Verzeichnisnamen

8. September 2010
von

Bei dynamischen Websites, die zum Beispiel mit PHP realisiert werden, wird oftmals eine komplette Website über eine einzige PHP-Datei gesteuert. Dabei werden Variablen als URL-Parameter übergeben und Seiten mit unterschiedlichen Inhalten generiert. So entstehen in der Regel unschöne URLs, die zum einen sehr lang und zum anderen weder für Menschen noch für Suchmaschinen verständlich sind. Mit ein bisschen PHP-Code lässt sich das ändern.

Mit ein paar Zeilen in der .htaccess-Datei lassen sich kurze und prägnante URLs generieren, bei denen Variablen nicht mehr über URL-Parameter sondern als Verzeichnisnamen übertragen werden. Aus

http://www.example.com/index.php?rubrik=leistungen&seite=beratung

wird dann

http://www.example.com/leistungen/beratung/

und suggeriert, dass es sich tatsächlich um Verzeichnisse handelt, in denen die Inhalte der Seite liegen.

Vorteile

Der Vorteil ist zum einen, dass die URLs deutlich kürzer werden. Gerade wenn man URLs beziehungsweise Links per Mail versendet oder gar in gedruckter Form veröffentlicht, ist eine kurze und einprägsame Adresse von großer Bedeutung. Ein weiterer Grund, auf URL-Parameter zu verzichten, liefern Suchmaschinen wie Google selbst. Sie raten davon ab, zu lange URLs zu verwenden, da solche Seiten deutlich schlechter bewertet und demzufolge auch nachrangig berücksichtigt werden bei der Anzeige von Suchergebnissen.

Laut Googles Starter Guide für die Suchmaschinenoptimierung sollten URLs

  1. kurz sein, auf URL-Parameter sowie Session-IDs weitestgehend verzichten,
  2. konkrete Bezeichnungen haben anstatt allgemeiner („leistungen“ statt „seite2“) und
  3. nicht zu viele Unterverzeichnisse besitzen.

Außerdem kann man mit der oben genannten Methode verschleiern, dass eine Website mit PHP programmiert ist. So erschwert man es Hackern, Sicherheitslücken eines Servers bzw. einer serverseitigen Programmiersprache auszunutzen, da die verwendete Programmiersprache nicht ersichtlich ist.

Drei Zeilen in die .htaccess-Datei

Um die Variablenübergabe über Verzeichnisnamen zu steuern, reichen drei Zeilen in der .htaccess-Datei aus:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /index.php

Die erste Zeile startet die „Rewrite Engine“ von Apache. In der zweiten Zeile wird die Bedingung für die in der dritten Zeile folgende Regel angegeben. Die Bedingung prüft, ob es sich bei der angeforderten Datei tatsächlich um eine existierende Datei handelt.

Achtung: Dies ist jedoch nur möglich wenn im Apache Server das Modul: modrewrite aktiviert ist. Andernfalls verursacht der soeben eingefügte Code einen Fehler und Ihre Webseite bleibt weiß.

Die Bedingung ist erfüllt, wenn es sich nicht um eine Datei handelt. Die Flag „-f“ prüft, ob es sich um eine Datei handelt, „!-f“ prüft – so wie es in dem Beispiel gebraucht wird –, ob es sich nicht um eine Datei handelt:

RewriteCond %{REQUEST_FILENAME} -f # Bedingung erfüllt, wenn es eine Datei ist
RewriteCond %{REQUEST_FILENAME} !-f # Bedingung erfüllt, wenn es keine Datei ist

Die Regel in der dritten Zeile leitet alle Anfragen („.*“), die nicht auf eine existierende Datei verweisen, an die Datei „/index.php“ weiter. Handelt es sich um eine exisitierende Datei (z. B. eine Grafik oder ein PDF-Dokument), so wird diese ganz normal aufgerufen, dargestellt bzw. zum Download angeboten.

Über die PHP-Datei lässt sich dann die URL auslesen und weiterverarbeiten. Alternativ lässt sich die Übergabe der URL-Parameter an die PHP-Datei auch direkt über den Eintrag in die .htaccess-Datei realisieren. Dazu die letzte Zeile der .htaccess-Datei austauschen:

RewriteRule ^([\w]+)/?([\w]+)? /index.php?rubrik=$1&seite=$2

Über die regulären Ausdrücke „([\w]+)“ werden Zeichenketten bestehend aus Buchstaben und Zahlen, die durch einen Schrägstrich getrennt sind, als Variable an die PHP-Datei übergeben. Das Fragezeichen hinter dem Schrägstrich und dem zweiten Ausdruck signalisiert, dass diese Werte optional sind. Das heißt, es kann auch nur ein Wert übergeben werden, und zwar für den Parameter „rubrik“.

Variablen auslesen mit PHP

Wer die erste Variante von „RewriteRule“ nutzt, muss die Variablen „rubrik“ und „seite“ per PHP aus der URL auslesen. Damit die „index.php“ die Variablen aus der URL auslesen kann, wird die URL an eine PHP-Variable übergeben:

$url = $_SERVER["REQUEST_URI"];

Die vorderfinierte Variable „$_SERVER[“REQUEST_URI”]“ enthält die URL, über die die PHP-Datei aufgerufen wurde. Im aktuellen Beispiel ist das „/leistungen/beratung/“.

Mit der Funktion „explode()“ wird die URL in ihre Bestandteile zerlegt und als Array weiterverarbeitet:

$url = explode("/", $url);

Da die Zeichenkette „/leistungen/beratung/“ anhand des Schrägstrichs zerlegt wird, werden dem Array in diesem Fall vier Werte übergeben, wobei der erste und der letzte Wert jeweils eine leere Zeichenkette sind, da vor dem ersten und nach dem letzten Schrägstrich keine Zeichen stehen.

Die eigentlichen Werte „leistungen“ und „beratung“ befinden sich an Position zwei und drei des Arrays. Sie werden jeweils einer Variablen zugeordnet:

$rubrik = $url[1];
$seite = $url[2];

In der zweiten Variante des „RewriteRule“-Eintrags in der .htaccess-Datei können die URL-Parameter direkt über „$_GET“ ausgelesen werden, ihne die Werte aus der URL zu extrahieren:

$rubrik = $_GET["rubrik"];
$seite = $_GET["seite"];

Wird nur ein Verzeichnis angeben (z. B. „/leistungen/“), so bleibt die Variable „$seite“ leer. Was nicht funktioniert, ist die Übergabe eines Wertes nur für die Variable „$seite“, da der erste Verzeichnisname immer der Variablen „$rubrik“ zugewiesen wird.

Ausnahmen festlegen

Möglicherweise will man nicht alle URL-Anfragen an die index.php weiterleiten. Das Verzeichnis „downloads“ soll z. B. nicht von der Datei „index.php“ sondern von „downloads.php“ verarbeitet werden. In diesem Fall fügt man nach der ersten Zeile der .htaccess-Datei folgende Zeile ein:

RewriteRule ^downloads$ /downloads.php

Jetzt wird die URL „/downloads/“ an die Datei „downloads.php“ verwiesen und kann von dort verarbeitet werden.

Fazit

Die hier vorgestellte Methode, um URL-Paramter zu übertragen, wird insbesondere von Content-Management-Systemen eingesetzt. Bei TYPO3 sorgt zum Beispiel die Erweiterung RealURL für solche kurzen und suchmaschinen-freundlichen URLs.

Vom Prinzip her arbeitet RealURL genau so wie die hier beschriebene Methode.

(mm),

Denis Potschien ist seit 2005 freiberuflich als Kommunikationsdesigner tätig, seit Anfang 2010 im Kreativkonsulat in Iserlohn, einem Büro für Gestaltung und Kommunikation. Dort betreut er kleine und mittelständische Unternehmen ebenso wie kommunale Körperschaften und Organisationen aus Südwestfalen und dem Ruhrgebiet. Als Webdesigner und -entwickler gehören HTML5 und CSS3 zu seinen Kernthemen, weshalb er dazu 2013 ein Buch geschrieben hat. „Pure HTML5 und CSS3“ richtet sich an alle, die Vorkenntnisse haben, sich aber bisher mit HTML5 und CSS3 nicht oder nur am Rande beschäftigt haben.

17 Kommentare zu „PHP und .htaccess: Lesbare URLs mit variablen Verzeichnisnamen
  1. jhb am 8. September 2010 um 12:27

    Ich würde die Auflösung gleich in der htaccess mit machen. Der apache ist da sicherlich schneller als das PHP-Skript.

  2. walktheweb am 8. September 2010 um 14:16

    Ein schöner Artikel der allerdings mit der beschriebenen Methode nur ganz leicht an der Rewrite-Oberfläche kratzt. Die beschriebene Methode ist für Blogs, welche fast ausschließlich mit dynamischen URLs arbeiten, mit Sicherheit ein guter Lösungsansatz. Der Nachteil bei dieser Methode ist allerdings, dass hierfür ein PHP-Script intern die übergebenen Parameter auswerten, validieren und entsprechend verarbeiten muss. Für eine normale Webseite müsste man sich, wenn man es richtig machen möchte, dann einen Controller basteln der fest definierte sets für das routing verarbeiten kann.

    Wenn es sich allerdings um eine überschaubare Webseite handelt, präferiere ich zu festgelegten routen in der .htaccess (Erfahrung und Kenntnisse mit regulären Ausdrücken vorausgesetzt). Hier ein paar Beispiele:

    RewriteRule ^kategorie/([\w]+)/$ index.php?category=$1 [NC,L]
    // kategorie/jquery – index.php?category=jquery

    RewriteRule ^benutzer/([\d]+)/$ index.php?userid=$1 [NC,L]
    // benutzer/123 – index.php?userid=123

    RewriteRule ^rss/([\w]+)/?([\d]+)$ index.php?rss=$1&catid=$2 [NC,L]
    // rss/smash/456 – index.php?rss=smash&catid=456
    // oder
    // rss/smash/ – index.php?rss=smash

    Ich sehe den Vorteil dieser Methode nicht nur in der besseren Übersicht, sondern auch in der Validierung durch das Rewrite-Modul und den regulären Ausdrücken, somit spart man sich einen Teil der Validierung im PHP-Script. Weiter lassen sich somit verschachtelt auch recht einfach ähnliche Regeln untereinander notieren da die .htacces Datei von oben nach unten abgearbeitet wird und somit verschiedene Fälle behandeln kann. Möchte man einen bestimmten Fall kurzeitig deaktivieren, stellt man der Regel am Anfang der Zeile einfach ein # voran um diese auszukommentieren.

    Dies nur mal so als ergäzendes Beispiel.

    cheers

  3. Sascha Affolter am 8. September 2010 um 17:20

    “So erschwert man es Hackern, Sicherheitslücken eines Servers bzw. einer serverseitigen Programmiersprache auszunutzen, da die verwendete Programmiersprache nicht ersichtlich ist.”

    Aber da PHP nunmal zu über 90 % verwendet wird, ist dieser Effekt eher nicht so prikelnd.

  4. jonas am 8. September 2010 um 17:25

    Hallo,

    welche Variante ist besser – die oben beschriebene oder die das man mithilfe von mod_rewrite an ein PHP Script mithilfe von Parametern weiterleitet (also z. B. auf ?p=TEST&c=TEST)
    Welche ist schneller? Hat mehr Vorteile?

    • Paul am 14. September 2010 um 20:14

      Ja, das Thema der Performance der unterschiedlichen Lösungen würde mich auch sehr interessieren.
      Ein paar weiterführende Links hätten dem Artikel nicht geschadet.

  5. Christian am 8. September 2010 um 23:45

    Schöner Artikel. Jedoch muss man wirklich kritisch bemerken, das wenn man schon so einen Artikel schreibt, auch die Parameter-Übergabe in der .htaccess beschrieben werden sollte.

    Dann hat man alles in einem. Es ist überschaubar und Sonderlösungen wie “downloads” geben auch mehr Sinn, da man nicht alles doppelt und dreifach konfigurieren muss.

    Ausserdem hat man noch die große Chance bei komplexen Projekt in Apache mit einer mapping-Datei zu arbeiten.

    grüsse
    christian

  6. Chris am 9. September 2010 um 09:30

    Seit langem wieder ein sehr guter Beitrag auf Dr. Web. Vielen Dank!

  7. Pumpe am 9. September 2010 um 11:55

    @Chris: Ich pflichte dir bei. Aber! DrWEB hat eigentlich immer gute Beiträge die den Technikhorizont erweitern. Musste mal gesagt werden. =)

    • Manuela Müller am 9. September 2010 um 13:24

      Danke Pumpe :-). Ich wollte mir schon vor Verzweifelung die Haare ausraufen, da es manchen Lesern einfach nicht recht zu machen ist.

  8. jhb am 9. September 2010 um 12:26

    Noch ein Nachtrag zu der Aussage, Hacker hätten es dann schwerer:

    Einmal einen Blick in die übertragenen header-Daten werfen – und schon sieht man, was da im Hintergrund werkelt.

    Und wer ganz einfach nur wissen will, ob PHP auf dem Server läuft – einfach mal versuchen eine index.php aufrufen:

    aus
    http://www.drweb.de/start/
    eifnach
    http://www.drweb.de/start/index.php

    Der Inhalt ist der gleiche, weil dieser Fall nicht abgedeckt wird.
    Hui, und der findige Hacker muss nun noch überlegen, ob wirklich PHP auf dem Server läuft?

  9. […] lesbare URLs – PHP und .htaccess – Dr. Web […]

  10. Linkhub – Woche 36-2010 | pehbehbeh am 15. September 2010 um 13:25

    […] Schönes Anfänger-Tutorial: PHP und .htaccess – Lesbare URLs mit variablem Verzeichnisnamen. […]

  11. Ah, un sonst so? am 6. Januar 2011 um 16:48

    […] PHP und .htaccess: Lesbare URLs mit variablen Verzeichnisnamen […]

  12. Andy am 26. November 2012 um 21:57

    Hi,
    danke für den guten Artikel. Endlich hab ich es geschaft dass meine langen id urls schön umgewandelt werden.

    Mfg, Andy

  13. Hans-Uwe Kraemer am 9. Juni 2013 um 04:31

    Vielen Dank für den Artikel.
    Wenn ich ehrlich bin habe ich das mit der .htaccess noch nie so richtig verstanden. Nun kann man aber vernünftig nachbauen.
    Zumindest will ich das jetzt glauben.

  14. Moritz am 12. November 2013 um 09:39

    Danke für den Aritkel. War mir eine große Hilfe bei der Erstellung meiner eigenen Seite.
    Nun beschäfftigt mich aber auch die Frage, welche Variante ist schneller?
    Die Parameter über die .htaccess an php zu übergeben, oder php die arbeit machen zu lassen und über $_SERVER[“REQUEST_URI”] an die Daten zu kommen und diese dann zu verarbeiten?

    Auch meine ich zu wissen, das eine .htaccess-Datei nur auf Apache-Servern ausgelesen und verwendet werden kann. Korrigiert mich wenn ich falsch liege.

  15. Christoph am 19. Februar 2014 um 20:46

    Danke dir ;) habe deine Seite gleich als erstes gefunden. Hat mir viel Zeit gespart.

    Weiter soo

Ein Kommentar? Schön!

Wir freuen uns immer über Leser, die durch nützliche und konstruktive Beiträge zum Thema eine Diskussion anstoßen oder den Artikel mit weiteren Informationen anreichern. Alle Kommentare werden in diesem Sinne moderiert. Zum Kommentar-Fairplay gehört für uns auch der Einsatz von rel="nofollow". Bitte verwenden Sie zudem als Namen weder eine Domain noch ein spamverdächtiges Wort. Vielen Dank!