Suchmaschinenfreundliche Datensatznavigation

Ich bin ziemlich sicher, dass dieser Artikel für viele Dreamweaver & PHP – Anwender interessant ist, aber zuerst einmal möchte ich den weniger sachkundigen Lesern einige häufig gestellte Fragen beantworten.

Was sind “suchmaschinenfreundliche” URLs ?

Unter diesem Begriff, der im Englischen auch als “search engine friendly” URLs bekannt ist und in der Leistungsbeschreibung von Content Management Systemen traditionell unter dem Kürzel SEF zu finden ist, versteht man eine auf dem Server definierbare automatische Umwandlung eines “dynamischen” Dateinamens wie www.example.com/countries.php?seite=2 zu einem “statischen” Dateinamen wie www.example.com/seite-2.html

Welche Vorteile bieten SEF?

  • Suchmaschinen haben eine klare Präferenz für Webseiten mit statischen Dateinamen, weil deren Endung “.html” oder “.htm” auf einen vom Autor manuell verfassten Inhalt mit demzufolge nur sporadisch zu erwartenden Änderungen schließen lassen. Eine Dateiendung wie “.php” hingegen sowie das Vorkommen von URL-Parametern ist ein verlässlicher Indikator für z.B. einen aus einer Datenbankabfrage automatisch generierten Inhalt, welcher sich erwartungsgemäß sehr schnell ändern kann, was von den Suchmaschinen eine entsprechend häufige Neuindizierung erfordert.
  • statische und möglichst kurze Dateinamen sind für Seitenbesucher der humanen Spezies deutlich einprägsamer.
  • sie lassen keine Rückschlüsse auf die eigentlich verwendete Programmiersprache zu und sind daher deutlich unattraktiver für Witzbolde oder gar Hacker, welche ansonsten immer wieder gerne die systemimmanenten Schwachstellen von URL-Parametern ausnutzen und probieren, das System durch z.B. Parametermanipulation auszutricksen.

Technische Voraussetzungen des Servers ?

Hinweis: da “Internet Service Provider” (ISP) PHP und MySQL-Datenbanken traditionell auf einen sog. “Apache” – Server aufsetzen, gelten die folgenden Erläuterungen auch nur für diesen Server.

1. Aktivierung des Server-Moduls “mod_rewrite”

Ob dieses Modul aktiviert ist oder nicht, lässt sich der sog. php.ini – Datei entnehmen:


Anzeige der installierten mod-rewrite Extension in der php.ini

Falls Sie Apache und PHP auf Ihrem lokalen Computer installiert haben und “mod_rewrite” nicht aktiviert sein sollte, können Sie dies nachträglich bewerkstelligen, indem Sie…

a) die regulär im Verzeichnis apache/conf/ befindliche Datei “httpd.conf” mit einem Texteditor öffnen

b) wie im folgendem Screenshot angezeigt, die Raute (#) am Anfang der Zeile LoadModule rewrite_module modules/mod_rewrite.so entfernen

c) die Datei speichern

d) den Server neu starten


die httpd.conf - Datei des Apache-Servers

Falls Ihr ISP hingegen “mod_rewrite” nicht aktiviert haben sollte, müssen Sie den Anbieter um Erledigung der o.g. Schritte ersuchen.

2. Verwendungsmöglichkeit von “.htaccess” – Dateien

Da wir den Apache-Server hinsichtlich des automatisch umzuwandelnden Dateinamens mit diversen “Regeln” füttern müssen und diese in Textdateien namens “.htaccess” definiert werden, muss die Verwendungsmöglichkeit dieses Dateityps in dern Servereinstellungen aktiviert sein.

Auf dem lokalen installierten Server können Sie dies ebenfalls in der bereits erwähnten Datei “httpd.conf” bewerkstelligen, indem Sie der Direktive “AllowOverride” den Wert “All” geben — Ihr ISP wiederum hätte dies auf Anfrage zu erledigen.

Nachdem nun alle technischen Voraussetzungen geklärt sind, beginnt ab hier das eigentliche…

Tutorial

Q: Unser Ziel ist ?
A: da ein virtueller Dateiname wie “countries-1.html” zwar einen numerischen Wert beinhaltet (1), dieser aber von der realen PHP-Seite nicht mehr als Wert eines nun nicht mehr existierenden URL-Parameters ausgewertet werden kann, müssen wir Teile des im Seitenkopf befindlichen Skripts als auch der Datensatznavigation dahingehend modifizieren, dass nunmehr eine Extraktion des o.g. numerischen Wertes aus dem in der URL angegebenen Dateinamen ermöglicht wird.

Schritt 1: Änderungen im Skript des Seitenkopfs

Der im folgenden Bild angezeigte Codeblock setzt diese Features um:

Zeile 1:

a) wir setzen die “globale” PHP-Variable Server['REQUEST_URI'] ein, welche eine in der Browser-Adresszeile angezeigte URL der Seite wie z.B. “http://www.example.com/countries-1.html” verwerten kann.

b) wir verwenden die PHP-Funktion explode und teilen die URL mittels des Separators “/” in ihre einzelnen Bestandteile auf

c) die PHP-Funktion “end” ermittelt den letzten Bestandteil der “zerlegten” URL, welcher logischerweise der Dateiname “countries-1.html” ist.

d) diesen Wert ordnen wir der Variable “p_name” zu.

Zeile 2:

innerhalb der PHP-Funktion preg_match definieren wir den vom Skript auszuwertenden Dateinamen wie folgt:

a) unsere bekannte PHP-Variable “urlparameter_name”, also z.B. den Wert “countries”

b) einen Bindestrich (-)

c) einen sog. “regulären Ausdruck” (auch “regular expression” oder “regex” genannt) mit dem Wert “(\d+)”, welcher definiert, dass an dieser Stelle ein oder mehr numerische Werte zu erwarten sind

d) die Dateiendung “.html”

Als zusätzliche Parameter der“preg_match” – Funktion verwenden wir den Dateinamen (p_name) sowie die Variable “match”, welche den in a) – c) definierten Dateinamen als Wert speichern wird

Zeile 3:

“match1“ extrahiert den durch den regex ermittelten numerischert Wert des Dateinamens, und dieser Wert wird der Variable “p_value” zugeordnet


Änderungen im Skript des Seitenkopfs

Q: Was haben wir damit erreicht?
A: Die Variable “p_value” ist nunmehr ein Substitut für die bis dato verwendete Variable “GET['pageNum']” und erfüllt letztlich die gleiche Aufgabe :: den numerischen Wert von Dateinamen wie “countries-2.html” oder “countries-23.html” zu speichern und der Datensatznavigation als Seitennummer zu übergeben.

Schritt 2: Anpassung des Warnhinweis – Skripts

dies dürfte in einigen Sekunden zu erledigen sein: einfach: die bisher verwendete Variable “GET['pageNum']” durch die Variable “p_value” ersetzen:


Anpassung des Warnhinweis-Skripts

Schritt 3: Anpassung der Datensatznavigation

Im Prinzip ändert sich hier nicht besonders viel, und wir müssen nicht einmal die Variable “p_value” explizit integrieren, weil auch deren Wert durch den “printf” – Parameter “%d” übergeben wird. Wir müssen hier allerdings berücksichtigen, dass die Navigationslinks nunmehr einen Dateinamen beinhalten müssen, welcher der vorher definierten “countries bindestrich zahl .html” – Regel entspricht — aber was soll´s, der folgende Screenshot bietet ja hinreichende Anhaltspunkte ;-)


Anpassung der Datensatznavigation

In diesem Screenshot sind einige Änderungen besonders hervorgehoben, und hier folgen die Erklärungen:

a) im “First” – Link verzichte ich offensichtlich auf den Bindestrich und den durch “%d” repräsentierten numerischen Wert – warum eigentlich?

Nun, wenn die Seite 1 mit den ersten 10 Datensätzen geladen wird, möchte ich, dass die URL nicht den Dateinamen “countries-0.html” beinhaltet, sondern “countries.html” — was funktionstechnisch gesehen keinen Unterschied machen und zum selben Resultat führen würde, aber dennoch den Suchmaschinen ein bisserl “merkwürdig” erscheinen mag, eben weil beide Seiten denselben Inhalt haben werden, was auch als “duplicate content” bezeichnet wird.

b) im Gegensatz zu Dreamweavers ursprünglicher Navigation möchte ich, dass der “Previous” – Link nur ab der Seite 2 angezeigt wird und nicht bereits auf Seite 1 — denn auf letztgenannter Seite führen sowohl “Previous” als auch “First” ohnehin zur Startseite, was ich persönlich nicht so clever finde.

Aus diesem Grund habe ich hier kurzerhand “> 1” definiert, was bedeutet “grösser als 1”

Schritt 3: die .htaccess – Datei

Wie bereits erwähnt, ist eine “.htaccess” – Datei eine reguläre Textdatei, die dem Apache-Server mittels spezifischem Code bestimmte Instruktionen gibt und die – wichtig bei unserem Vorhaben – unter dem Namen “.htaccess” im Arbeitsverzeichnis der Datei “countries.php” gespeichert wird.

Auch wenn man diese Datei theoretisch auch mit Dreamweaver erzeugen könnte, halte ich dies für “Overkill” und empfehle die Verwendung eines reinen Texteditors wie “Notepad”, was deutlich schneller und einfacher zu handhaben ist.

Hier der für unseren Zweck relevante Code der “.htaccess” – Datei sowie einige zusätzliche Erläuterungen:


Code der htaccess - Datei sowie Erläuterungen

Ich habe im obigen Beispiel zwei “RewriteRule” – Instanzen definiert, die bei Aufruf der realen Datei “countries.php” im Browser folgende Anweisungen geben:

a) Falls die Datei “countries.php” als solche aufgerufen wird, gib soll sie in der Browser-Adresszeile als “countries.html” angezeigt werden.

b) Falls “countries.php” irgendeine numerische Information mitliefert, soll diese mittels des “Platzhalters” erfasst und Bestandteil des virtuell generierten Dateinamens “countries-” werden, d.h. in diesem Fall “countries-1.html”.

“Tja”, so mag der kritische Leser dieses Tutorials jetzt fragen, “aber nachdem wir vorhin die Links der Datensatznavigation geändert haben, enthalten diese doch keine '?seite=1' – URL-Parameter mehr, welche wir der RewriteEngine als 'realen Seitennamen' vorgelegt haben ?”

Sie haben eindeutig recht, und im Endeffekt könnten Sie sogar hergehen und in der 2. RewriteRule den Parameter zu “?yadda=” ändern, was im Endeffekt keinen Unterschied machen und auch hiermit funktionieren würde.

Bei einer Entfernung des kompletten URL-Parameters oder aber einer Änderung der Reihenfolge zu bsp. “yadda?=” würden Sie nach Klicken eines Navigationslinks im Browser eine “die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist” – Fehlermeldung des Servers erhalten, was letzten Endes nur eines bedeutet: wir brauchen an dieser Stelle tatsächlich einen fiktiven URL-Parameter mit der Syntax “?wasauchimmer=”. Probieren Sie´s ruhig mal aus ! :-))

Das Resultat im Browser

So, und nun ist es an der Zeit, die Früchte unserer durchaus frickeligen Arbeit zu genießen, indem wir die Seite mittels der Dreamweaver-Vorschau in den Browser laden und nach Belieben herumnavigieren — na was sehen wir denn da:


Browservorschau der Seite 2

Jau, die definierten RewriteRule – Regeln zeigen uns in der Adressleiste des Browser die erhofften “friendly URL” – Dateinamen an, und die Modifikationen der Seitenskripts führen ebenfalls zum gewünschten Ergebnis und laden in jede der “virtuellen” Seiten tatsächlich die korrekten Datensätze.

Gratulation, Sie haben´s geschafft, und hiermit ist das “Datensatz-Navigation” – Tutorial beendet.