27. März 2012 | 1 Comment Willkommen zum zweiten Tutorial bezüglich „einfache SEO URLs“. Im Gegensatz zum ersten Tutorial möchte ich Heute etwas genauer auf die kleinen Feinheiten eingehen die es zu beachten gilt. Hier ein paar Stichpunkte die unbedingt einzuhalten sind, wenn die URL Suchmaschinen-freundlich sein soll: Es dürfen nicht mehrere URLs auf die gleichen Inhalte linken (Duplicate content). Alte links (z.B. aus Twitter, Facebook, alte Blogs) sollten immer auf die entsprechend neuen Seiten verlinken (per 301 Header). Keine Groß- und Kleinschreibung mischen Keine Sonderzeichen verwenden Ich denke mit diesen vier Punkten ist das wichtigste gesagt! Aber natürlich gehe ich auf diese einzelnen Punkte noch etwas genauer ein… Am Ende möchte ich eine kurze Funktion vorstellen um einen kompletten String in ein URL-taugliches Format zu bringen. Duplicate content Der Begriff duplicate content (Doppelte Inhalte) beschreibt Seiten, deren Inhalte gleich sind – Jedoch unter verschiedenen Adressen abrufbar sind. Ein ganz einfaches Beispiel: Wir gehen von einer Webseite aus, die mit GET Parameter arbeitet. Die Reihenfolge dieser Parameter lässt sich in der Regel vertauschen ohne Einfluss auf das dargestellte Ergebnis zu haben (von Paramtern wie „xyz[]“ mal abgesehen, da diese ein Array bezeichnen). Demnach würden diese Adressen die gleiche Seite liefern: http://web-developer-blog.com?a=1&b=2 http://web-developer-blog.com?b=2&a=1 Das Problem – Suchmaschinen sehen hier zwei einzigartige Adressen… Und damit hätten wir bereits duplicate content. Das Ergebnis – Abzüge im Ranking. Wir sollten also, wenn möglich, auf GET Parameter verzichten und stattdessen lieber die „leserlichen“ Adressen, wie wir sie aus dem letzten Tutorial kennen, nutzen… Aber kommen wir zu einer weiteren Problematik! Die „leserlichen“ Adressen birgen ebenfalls ihre Stolper-fallen! So sind diese Adressen Beispielsweise beide gültig und werden vom PHP Skript identisch bearbeitet… Dennoch handelt es sich (aus Suchmaschinen-Sicht) um zwei unterschiedliche Adressen: http://web-developer-blog.com/snippets-und-tools http://web-developer-blog.com/snippets-und-tools/ Diese Situation lässt sich aber ganz einfach in den Griff bekommen. Wir müssen uns nur entscheiden: Soll die Version mit oder ohne den endenden Slash die Standard-Version sein? Hier müssen wir nämlich selbst Hand anlegen und die Versionen zueinander umleiten (z.B. die Version mit Slash zu der, ohne Slash). Ganz wichtig: Dies muss mit einem 301 Status Header passieren! Dieser besagt nämlich folgendes: 301 Moved Permanently Die angeforderte Ressource steht ab sofort unter der im „Location“-Header-Feld angegebenen Adresse bereit. Die alte Adresse ist nicht länger gültig. Streng genommen ist diese Aussage nicht ganz richtig (denn die alte Adresse ist noch immer erreichbar), aber es wird benötigt um Browsern und Suchmaschinen mitzuteilen welche Adresse anzusteuern ist und welche nicht. In PHP wird dies folgendermaßen gemacht: // Beispielhafte Weiterleitung mit 301 Header. $neue_url = 'http://web-developer-blog.com'; header("HTTP/1.1 301 Moved Permanently"); header("Location: " . $neue_url); Mit einem ähnlichen kleinen PHP Skript leite ich alle Anfragen von http://blog.leonardfischer.de und http://web-developer-blog.de auf http://web-developer-blog.com um 🙂 Übrigens, die folgenden Adressen müssen ebenfalls berücksichtigt werden: http://www.web-developer-blog.com http://www.web-developer-blog.com/ http://www.web-developer-blog.com/index.php http://web-developer-blog.com http://web-developer-blog.com/ http://web-developer-blog.com/index.php SEO kann also doch etwas aufwändig werden… Übrigens gibt es noch eine Alternative zum umleiten: Canonical Links! Diese gehören auf jede Seite und geben stehts die „original“ Seite an… Das bedeutet, wir brauchen keine Weiterleitungen machen, müssen dafür aber im Canonical Link angeben, welches die korrekte Adresse für die aktuelle Seite ist. Diese Methode ist allerdings „verhältnismäßig“ neu und könnte von älteren Browsern oder manchen Suchmaschinen nicht beachtet/verstanden werden. 301 Weiterleitung Diesen Punkt habe ich vorhin schon kurz angeschnitten – Wenn wir von „alten“ Seiten (z.B. von einer alten URL) auf eine neue Seite weiterleiten möchten, müssen wir immer 301 Status Header benutzen. Dieser Status sagt den Browsern und Suchmaschinen das die alte Seite nicht länger aktuell ist. Wie im ersten Abschnitt erklärt benutze ich die 301 Weiterleitung um Links von der alten Domain (http://blog.leonardfischer.de) weiterzuleiten. Dazu benutze ich die gleichen Zeilen Code wie im PHP Beispiel von oben – Mit einer kleinen Ausnahme: Damit auch die alten Links (wie z.B. http://blog.leonardfischer.de/2012/03/php-5-4-0-erschienen.html) funktionieren, nehme ich mir aus dem $_SERVER Array die „REQUEST_URI“ (Also „/2012/03/php-5-4-0-erschienen.html“) und hänge es hinten an die neue Adresse an. Damit ist gewährleistet das alle Links, die ich in der Vergangenheit gepostet habe (bei Twitter, Facebook, …) noch funktionieren! Keine Groß- und Kleinschreibung mischen Ähnlich wie bei Dateinamen- und Endungen sollten Adressen im Internet komplett kleingeschrieben werden. Das ist einerseits ein Schritt um „duplicate content“ zu vermeiden und andererseits die Funktionen unserer Seite zu gewährleisten. Je nach Server OS (Windows, Linux) wird nämlich mit Groß- und Kleinschreibung unterschiedlich umgegangen. Sollten wir also innerhalb von PHP dynamische links erstellen, ist es sicherlich nicht verkehrt die Funktion strtolower zu nutzen um den fertigen String in Kleinbuchstaben zu formatieren – Vor allem wenn wir Links aus Datenbank-Inhalten generieren (wie dieser Blog z.B.). Keine Sonderzeichen verwenden Sonderzeichen sind zwar im Begrenzten Maße innerhalb der URL erlaubt, doch wir müssen unser Skript ja nicht mutwillig auf die Probe stellen – Oder? Spätestens wenn verschiedene Enkodierungen innerhalb eurer PHP Skripte, der Datenbank oder des zurückgelieferten HTML benutzt werden wird schnell klar wieso. Dabei kann es so einfach sein: Versucht Umlaute und spezielle Sonderzeichen, die in anderen Kodierungen ggf. nicht funktionieren, zu vermeiden. Adressen wie Beispielsweise http://web-developer-blog.com/2012/03/php-5-4-0-erschienen.html sind vollkommen in Ordnung. Diese lassen sich absolut problemlos im Skript verarbeiten und sind sowohl für eure Besucher als auch für Suchmaschinen perfekt geeignet. Diese Adresse jedoch http://web-developer-blog.com/2012/03/PHP 5.4.0 erschienen.html ist zwar für den Benutzer leserlicher, jedoch für euer Skript schwieriger zu verarbeiten – und zwar aus folgenden Gründen: Vermischte Groß- und Kleinschreibung Leerzeichen werden als „%20“ behandelt (URL-enkodiert) Die Punkte können das Skript verwirren (da diese typischerweise den Dateinamen von der -Endung trennen – Kommt allerdings auf euer Skript an) Außerdem würde die folgende Adresse unter Umständen die gleiche Seite darstellen (duplicate content) http://web-developer-blog.com/2012/03/PHP%205.4.0%20erschienen.html Und diese ist wiederum sehr unleserlich 🙁 Nun, ich hoffe ihr könnt mit den bisherigen Tipps einiges anfangen! Ich hatte ja außerdem noch geschrieben ich würde eine kleine Funktion vorstellen um einen x-beliebigen String in ein URL-konformes Format zu konvertieren? Hier bietet PHP bereits eine eigene Funktion an: /* * Dem PHP Skript muss die Locale bekannt gemacht werden * damit Umlaute korrekt transliteriert (ä -> ae) werden. */ setlocale(LC_ALL, 'de_DE'); /* * "UTF-8" ist das Eingabe-Format. * "ASCII" ist das Ausgabe-Format. * Der Zusatz "//TRANSLIT" sorgt dafür das Zeichen, welche in der Ziel-Kodierung * nicht existieren, durch andere (ähnliche) Zeichen dargestellt werden. */ $url = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower($string)); // Den angepassten String müssen wir nun noch etwas verfeinern. $url = preg_replace('~\W~', '-', $url); echo preg_replace('~(-)+~', '-', $url); Solltet ihr die iconv Funktion allerdings nicht zur Verfügung haben kann ich euch nur die „title“ Methode des Kohana-Frameworks ans Herz legen (in der Klasse Kohana_URL) – Hier könnt ihr euch die Methode ansehen! Außerdem benötigt ihr noch die folgende Datei: transliterate_to_ascii – Hier sind die Transliterationen gespeichert. Ich wünsche euch viel Spaß mit dem neuen Wissen und würde mich sehr über zusätzliche Infos in den Kommentaren freuen! Eine schöne Woche euch da draußen!