Ich stehe ‚mal wieder vor einer fundamentalen Frage: „Wie ersetze ich die alte URL-Struktur so, dass die neue (Suchmaschinen-optimierte) Struktur zurück übersetzt werden kann?“

Warum optimieren?

Suchmaschinen mögen keine dynamischen URLs. Wenn also ein Query benutzt wird um eine Seite eindeutig zu identifizieren (so wie: index.php?s=eineseite) dann kann es passieren, dass einige Seiten nicht indiziert werden.

Keine Indizierung bedeutet keine Besucher über die Suchmaschinen.

Um den Suchmaschinen die Seiten trotzdem schmackhaft zu machen, gaukeln wir eine statische Struktur vor. Am häufigsten wird dafür eine Ordnerstruktur verwendet.

Aus index.php?s=eineseite wird also /eineseite/.

Eine andere Möglichkeit wäre z.B. falsche Dateinamen zu erstellen, also in meinem Fall: eineseite.html. (Besser wäre eineseite.php, da angehängte Queries bei php-Extensions glaubhafter sind. Aber das spielt für Suchmaschinen vermutlich keine Rolle.)

Die Problemstellung

Im Moment sieht meine URL so aus: ?s=eineseite&a=eineaktion&p1=einparameter. Durch „s“ und „a“ wird die Seite, die angezeigt werden soll, eindeutig identifiziert.

Jedoch sind „s“ und „a“ optional und es können zusätzlich dynamische Parameter in der URL vorkommen.

Die dynamischen Parameter sollen nicht in der optimierten URL vorkommen, da diese für die Suchmaschine vernachlässigbar sind. Optimiert werden soll also nur dieser Teil der URL: ?s=eineseite&a=eineaktion.

Die einfache URL

Die beste Lösung wäre für mich die Übersetzung von ?a=einaktion&s=eineseite zu /eineaktion/eineseite/.

Allerdings müsste ich dann eine Liste führen, welche Aktionen und Seiten es gibt, was die Performance des Servers bei jedem Seitenrequest negativ beeinflusst.

Was aber noch viel wichtiger ist: Durch die Optionalität von „s“ und „a“ dürfen Aktionen und Seiten niemals die gleichen Werte haben, da sie sonst nicht auseinanderzuhalten sind.

Die URL mit Parameternamen

Eine Möglichkeit aus ?s=eineseite&a=eineaktion eine Suchmaschinen optimierte URL zu generieren wäre: /s/eineseite/a/eineaktion.

Das gefällt mir aus zwei Gründen nicht:

  1. Die Query-Teile können als unabhängige Teile aufgefasst werden. So ist nicht klar, dass „s“ dem Wert „eineseite“ zugeordnet ist. (Das gleiche gilt für „a“ und „eineaktion“.)
  2. Es ist nicht klar wie die URL /s/a/irgendwas/ behandelt werden soll. Es könnte sich bei „a“ um den Wert von „s“ handeln, oder „s“ könnte einen leeren Wert haben und „irgendwas“ ist „a“ zugeordnet.

Die verbesserte URL mit Parameternamen

Wenn man sich die zweite Lösung ansieht kommt man wahrscheinlich auf diese Lösung: /s-eineseite/a-eineaktion/.

Es ist nicht die eleganteste Lösung, aber es erfüllt alle Anforderungen: „s“ und „eineseite“ sind zwingend verbunden und sowohl „s“ als auch „a“ sind optional. Die Übersetzung in die alte URL ist auch leicht möglich, Einschränkungen gibt es keine.

Echte Seiten mit dynamischen Namen

Eine Alternative zu den ersten drei Varianten wäre, den Suchmaschinen echte Seitennamen zu bieten: /s-eineseite-a-eineaktion.html.

Allerdings hat das einen Nachteil: Wenn die Parameterwerte „eineseite“ und „eineaktion“ Bindestriche enthalten dürfen, könnte es zu Problemen kommen. Denn wie wird z.B. /s-eine-a-seite-a-eineaktion.html übersetzt? „?s=eine&a=seite-a-eineaktion“? Oder vielleicht „?s-eine-a-seite&a=eineaktion“?

Abhilfe würde hier nur eine Werteeinschränkung schaffen. Aber wer will schon Einschränkungen bei seiner Namensgebung haben? 🙂

Die dynamischen Parameter

Die dynamischen Parameter benötigen keine spezielle Behandlung. Man kann sie einfach an die neue URL anhängen: /s-eineseite/a-eineaktion/?p1=einparameter&p2=nocheinparameter.

Die Umsetzung

Ich übersetze mit der .htaccess Datei die neue URL (/s-eineseite/a-eineaktion/) in die alte (/?s=eineseite&a=eineaktion). Eine Alternative wäre jede Anfrage per .htaccess auf index.php weiterzuleiten und dort die URL zu verarbeiten. Ich vertrete allerdings die Ansicht, dass man solche Eingriffe möglicht früh machen sollte, also noch bevor eine Seite aufgerufen wird.

Demnach erstelle ich eine .htaccess Datei, die folgenden Inhalt enthält und im gleichen Verzeichnis, wie meine Hauptseite „index.php“ liegt:

Options +FollowSymLinks
RewriteEngine On
RewriteRule s-(.*)/a-(.*)/ /?s=$1&a=$2&%{QUERY_STRING} [PT]
RewriteRule a-(.*)/s-(.*)/ /?s=$2&a=$1&%{QUERY_STRING} [PT]
RewriteRule s-(.*)/ /?s=$1&%{QUERY_STRING} [PT]
RewriteRule a-(.*)/ /?a=$1&%{QUERY_STRING} [PT]

Was macht dieser Code?

Options +FollowSymlinks sagt dem System, dass es symbolischen Links folgen, und weitere URL-Bearbeitung wie Alias-Befehle beachten soll. Das kann man unter Umständen ohne Nebeneffekte weg lassen.

RewriteEngine On schaltet die Rewrite Engine ein, die das umschreiben der URLs ermöglicht.

RewriteRule [Source] [Target] [Directive] stellt mit Regular Expressions die Regeln zur Konvertierung der URLs dar.

Um Dublicate Content auszuschließen, sollte die erste oder zweite RewriteRule gelöscht werden. Damit lassen sich „a-eineaktion“ und „s-eineseite“ zwar nicht mehr vertauschen, aber es kommt dafür auch zu keinen unerwünschten Nebenwirkungen in den Suchmaschinen.

Wer nicht mit Regulären Ausdrücken vertraut ist, kann sich stattdessen dem folgenden Code bedienen:

Options +FollowSymLinks
RewriteEngine On
RewriteRule . index.php?{QUERY_STRING} [PT]

Dieser Code leitet alle Anfragen an index.php weiter und ermöglicht damit die Interpretation der URL mit PHP. Die angefragte URL befindet sich übrigens in $_SERVER[‚REQUEST_URI‘].

Unterstrich oder Bindestrich?

Mir persönlich gefällt das Schriftbild mit Unterstrichen besser. Bei einer Darstellung der URL könnte allerdings der Unterstrich durch den Link-bedingten Unterstrich verdeckt werden, was zu Unterscheidungsschwierigkeiten zwischen einem Leerzeichen und dem Unterstrich führen kann.

Viel wichtiger ist allerdings der SEO-Aspekt: Bindestriche sind demnach definitiv dem Unterstrich vorzuziehen, da bei Suchbegriffen kaum ein Unterstrich benutzt wird.

Update: Google wird in Zukunft auch Unterstriche als Wortseperatoren erkennen.

Google hebt beim Suchbegriff „SEO-Techniques“ „SEO Techniques“ und „seo-techniques“ hervor, allerdings nicht „seo_techniques“.

SEO-Technique Google Result

Beim Suchbegriff „SEO Techniques“ (ohne Bindestrich) wird zwar sowohl „seo-techniques“ als auch „seo_techniques“ hervorgehoben, allerdings wüsste ich nicht, warum ich mir das Highlight bei der Unterstrich-Variante vorenthalten sollte. 🙂

SEO Technique Google Result

Bessere Ideen?

Wenn man Erfahrung in Objekt Orientierter PHP-Programmierung hat, kann man sich das CodeIgniter Framework ansehen. Damit lässt sich mit dem MVC-Pattern und bereits optimierten URLs programmieren. URLs haben dort die Form: /class/function/ID, wobei ID die Parameter sind die der Funktion übergeben werden.

Wie würdest du ?s=eineseite&a=eineaktion in eine suchmaschinenfreundliche Form übersetzen?

Veröffentlicht unter WebDev.

Schreibe eine Antwort

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Erforderlich

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.