Weiterleitung in der .htaccess und suchmaschinenfreundliche URL's

  1. Zum Inhalt springen

webdesign
klamonfra
Klaus Franz


Wie wird eine HTTP-Weiterleitung eingerichtet?

25Jul2014

Optimierung - Weiterleitungen in der .htaccess-Datei und suchmaschinenfreundliche URL's


Die sogenannte .htaccess (hypertext access - Hypertext-Zugriff)-Datei ist eine Server-Konfigurationsdatei, in der verzeichnisspezifische Einstellungen auf den Webservern vorgenommen werden können. Die Datei selber ist eine reine Textdatei, hat keinen Namen und muss die Endung ".htaccess (hypertext access - Hypertext-Zugriff)" haben.
Mit ihr lassen sich dann unter anderem Zugriffsberechtigungen für Dateien und Verzeichnisse oder automatische Weiterleitungen einstellen. Sie können sogar festlegen, ob die Daten an den aufrufenden Browser komprimiert übertragen werden sollen.

Für die Weiterleitungen benötigen Sie beim Apache-Server das "mod_rewrite" Modul, welches Sie dafür zuerst in der zentralen Konfigurationsdatei "httpd.conf" aktivieren müssen. Mit dem "mod_rewrite" Modul sind Sie dann in der Lage URL (Uniform Resource Locator (world wide web address))'s zu manipulieren, also beim Aufruf einer Website auf eine andere Adresse umzuleiten.

Ich zeige Ihnen hier verschiedene Beispiele für eine URL (Uniform Resource Locator (world wide web address)) Umleitung durch die ".htaccess (hypertext access - Hypertext-Zugriff)-Datei" die ich für meine Webseiten benutzt habe.


Suchmaschinenfreundliche 301 Weiterleitung von "nicht www" URL's zu "www" URL's

Diese Weiterleitung ist wichtig um doppelten Inhalt (Duplicate Content) in den Suchmaschinen zu vermeiden, dass heißt eine Webseite wäre sowohl mit "www" als auch "ohne www" zu erreichen, und das bestrafen die Suchmaschinen durch Ignoranz der Website.

Um das zu vermeiden benötigt man den folgenden Code in der ".htaccess (hypertext access - Hypertext-Zugriff)-Datei".

RewriteEngine on

# Weiterleitung auf www.
RewriteCond %{HTTP_HOST} ^webdesign-klamonfra\.de$
RewriteRule ^(.*)$ http://www.webdesign-klamonfra.de/$1 [L,R=301]

Was wird hier genau gemacht?

Zuerst schalten Sie mit "RewriteEngine on" das "mod_rewrite" Modul ein. Diese Zeile benötigen Sie nur einmal, egal wie viele Rewrite-Befehle Sie danach noch benutzen.

Die "RewriteCond" legt die Bedingung fest.
Wenn im aufgerufenen Domainennamen "%{HTTP_HOST}" webdesign-klamonfra.de vorkommt, dann soll...
Der Haken "^" definiert dabei einen Anker mit der eine Zeichenkette anfängt und mit dem Anker "$" aufhört. In dem Beispiel, dass die Adresse mit "webdesign-klamonfra" ohne "wwww." beginnen muss und mit .de aufhört.
Der Backslash "\" vor dem Punkt ist wichtig, da der Punkt ansonsten für einen Operator steht. Durch den Backslash ist der Punkt also ein tatsächlicher Punkt. Weitere Operatoren sind ^ . $ ? * + ( ) [ ]. Kommt eines dieser Zeichen in der URL (Uniform Resource Locator (world wide web address)) vor, sollte das Sonderzeichen durch einen Backslash "\" getrennt werden.

Nun wird die Regel "RewriteRule" festgelegt.
Ist nun also die Bedingung erfüllt, wird alles (.*) (bedeutet alles) hinter dem HTTP_HOST in eine Variable "$"" geschrieben, und hinter dem Domainennamen "http://www.webdesign-klamonfra.de/" durch "$1" angehangen.
Damit es auch den Status einer dauerhaften 301 Weiterleitung erhält, wird ein entsprechendes "Flag" gesetzt "[R=301]" und das "L" sorgt dafür, dass wenn diese Regel ausgeführt wurde, keine weitere mehr zum Einsatz kommt.

Die Weiterleitung könnte auch wie folgt eingerichtet werden.

RewriteCond %{HTTP_HOST} !^www$
RewriteRule ^(.*)$ http://www.webdesign-klamonfra.de/$1 [L,R=301]

Der Unterschied zu der ersten Schreibweise liegt nur in der "RewriteCond".
Wenn im aufgerufenen Domainennamen "HTTP_HOST" "www" nicht vorkommt, dann soll...
Durch das Ausrufungszeichen "!" wird abgefragt, dass die Adresse nicht mit "www" beginnt.
Der Rest der Anweisung ist dann wieder gleich.

Fertig! Zum Testen genügt der Aufruf der Startseite mit:
http://webdesign-klamonfra.de"
... und Sie sehen in der Adresszeile die umgeleitete Adresse:
"http://www.webdesign-klamonfra.de"
und damit ist das Problem des Duplicate Content beseitigt.


Umleitung der Startdatei auf das Stammverzeichnis

Das ist das Nächste was ich eingerichtet habe um doppelten Inhalt zu vermeiden, denn die Startseite einer Website wäre sowohl mit www.domain.de/index.html als auch mit www.domain.de/ erreichbar und somit über zwei unterschiedliche URL (Uniform Resource Locator (world wide web address))'s aufrufbar.

Auch diese index.html oder in meinem Fall index.php kann mittels der ".htaccess (hypertext access - Hypertext-Zugriff)-Datei" durch den folgenden Code zu der Hauptdomaine weitergeleitet werden.

# Weiterleitung von index.php auf www.webdesign-klamonfra.de
RewriteCond %{THE_REQUEST} index\.php [NC]
RewriteRule ^index\.php$ http://www.webdesign-klamonfra.de/ [L,R=301]

Was macht der Server?

Die "RewriteCond" legt wieder die Bedingung fest.
Wenn in der vollständig aufgerufenen Domaine "THE_REQUEST" index.php vorkommt, dann soll...

Nun wird wieder die Regel "RewriteRule" festgelegt.
Ist nun also die Bedingung erfüllt, wird für die Zeichenkette "index.php" "http://www.webdesign-klamonfra.de/" ausgegeben, und damit es wieder den Status einer permanenten 301 Weiterleitung erhält, setzt man wieder das "Flag" "[R=301]" und das "L".

Da ich in meinem Webauftritt aber nur eine index.php habe, kann ich auch auf die Bedingung verzichten und wende nur die Regel an.

# Weiterleitung von index.php auf www.webdesign-klamonfra.de
RewriteRule ^index\.php$ http://www.webdesign-klamonfra.de/ [L,R=301]

Fertig! Zum Testen genügt auch hier der Aufruf der Startseite mit:
http://www.webdesign-klamonfra.de/index.php"
... und Sie sehen in der Adresszeile die umgeleitete Adresse:
"http://www.webdesign-klamonfra.de"
und damit ist auch dieses Problem des Double Content beseitigt.


Mehrere Schrägstriche/Slashes am Ende einer URL entfernen

Eine Webseite ist leider mit "*.php/" und "*.php" aufrufbar und auch das gilt es zu vermeiden.

Um von einer aufgerufenen URL (Uniform Resource Locator (world wide web address)) den abschließenden Schrägstrich zu entfernen und die Anfrage auf die Adresse ohne Slash umzuleiten, geht man wie folgt vor.

# Mehrere Slashes am Ende und einer URL entfernen
RewriteRule ^(.*)/$ http://%{HTTP_HOST}/$1 [L,R=301]

Was macht der Server?

Hier benötige ich auch keine separate Bedingung, eine "RewriteCond", da ich von allen Adressen den Schrägstrich entfernen möchte.

Es wird also nur die Regel "RewriteRule" festgelegt.
Alles (.*) (bedeutet alles) vor dem Schrägstrich "/" wird in eine Variable "$" geschrieben, und durch "$1" ausgegeben.

Fertig! Zum Testen habe ich das Impressum mit einem Schrägstrich am Ende der Adresse ausgesucht:
http://www.webdesign-klamonfra.de/impressum.php/"
... und Sie sehen in der Adresszeile die umgeleitete Adresse:
"http://www.webdesign-klamonfra.de/impressum.php"
und damit ist auch das letzte Problem des Double Content gelöst.



Mehrere Schrägstriche/Slashes am Ende und innerhalb der URL entfernen

Und nun sorge ich auch noch dafür dass mehrere Schrägstriche innerhalb einer Adresse entfernt werden.

# Mehrere Slashes am Ende und innerhalb der URL entfernen
RewriteRule ^(.*)/$ http://%{HTTP_HOST}/$1 [L,R=301]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ //+([^\ ]*)
RewriteRule .* http://%{HTTP_HOST}/$1 [L,R=301]

Fertig! Zum Testen habe ich diesmal eine Adresse der Codeschnipsel mit ganz vielen Schrägstrichen genommen:
http://www.webdesign-klamonfra.de/////codeschnipsel////fade-effekt.php//
... und Sie sehen in der Adresszeile die bereinigte Adresse:
"http://www.webdesign-klamonfra.de/codeschnipsel/fade-effekt.php"
und damit ist auch das allerletzte Problem des Double Content gelöst.



Erzeugen einer sprechenden, lesbaren URL

Auf der Fotoseite hatte ich den Wunsch die Seiten der Gästebucheinträge von einer dynamischen auf eine statische und damit lesbare Seite umzuleiten. Blättern Sie zum Testen auf eine der nächsten Gästebuchseiten und Sie werden sehen, dass zum Beispiel die zweite Seite mit gaestebuchseite-2 aufgerufen wird.

Hierzu habe ich die folgende Regel definiert.

# Weiterleitung von gaestebuch.php?seite=2 auf gaestebuchseite-2
RewriteRule ^gaestebuchseite-([0-9]+) gaestebuch.php?seite=$1 [R=301,L]

Was macht der Server?

Die Anfrage wird nach "gaestebuchseite-(ZAHL)" untersucht und die gefundene "ZAHL" in der Variablen "$" gespeichert. Danach wird die Anfrage intern auf "gaestebuch.php?seite=ZAHL" weitergeleitet. Die URL (Uniform Resource Locator (world wide web address))-Leiste im Browser bleibt dabei unverändert.

Würde die RewriteRule ohne Plus "+" geschrieben, also wie folgt aussehen:
RewriteRule ^gaestebuchseite-([0-9]) gaestebuch.php?seite=$1 [R=301,L],
würden nur die Seiten 1 bis 9 angesprungen. Beim Aufruf, zum Beispiel der Seite 41, würde man auf die Seite 4 weitergeleitet.


08Feb2015

Die Adresszeile im Browser wird auch lesbar


Um die Adresszeile auch im Browser lesbar zu gestalten, habe ich die Regel weiter verbessert und umgeschrieben.

# Weiterleitung von gaestebuch.php?seite=2 auf gaestebuchseite-2
RewriteCond %{QUERY_STRING} ^gaestebuch.php?seite=([0-9]+)$
RewriteRule ^(.*) http://www.klamonfra.de/gaestebuchseite-%1? [R=301,L]
RewriteRule ^gaestebuchseite-([0-9]+)$ /gaestebuch.php?seite=$1

Der Query-String beinhaltet alles was nach dem Fragezeichen kommt, also "seite=(Zahlen)". Wenn so ein String also vorkommt, dann soll...

Die "RewriteRule" legt nun folgendes fest.
Ist nun also die Bedingung erfüllt, wird alles (.*) hinter der Zeichenkette "seite=" in eine Variable $ geschrieben, also in diesem Fall die Seitenzahl, und hinter der Adresse http://www.klamonfra.de/gaestebuchseite- durch $1 angehangen.
Und für die dauerhaften 301 Weiterleitung wird das "Flag" gesetzt [R=301,L]

Die zweite "RewriteRule" untersucht die Anfrage nach "gaestebuchseite-ZAHL" und die gefundene ZAHL wird in der Variablen $ gespeichert. Danach wird die Anfrage intern auf "gaestebuch.php?seite=ZAHL" weitergeleitet.

Damit ist auch die Adresszeile im Browser lesbar.


Und auch bei dem Grußkartenversand sah der Aufruf eines Kartenmotivs für den Benutzer verwirrend aus.
Hierbei muss nämlich beim Aufruf der Grußkarte auch der Name des Bildes übergeben werden und die Adresse erhält dadurch eine sehr komplexe und unleserliche Form. Mit Hilfe der ".htaccess (hypertext access - Hypertext-Zugriff)-Datei" wird solch ein komplexer Verweis zu einer anderen Seite wie folgt umgeschrieben:

# Weiterleitung von
# grusskarte/grusskarteschreiben.php?pic=name.JPG
# auf
# grusskarte-name
RewriteRule ^grusskarte-(.*) 
            grusskarte/grusskarteschreiben.php?pic=$1\.JPG [R=301,L]

Damit erzeugt man eine permanente 301 Weiterleitung auf die ausgesuchte Grußkarte. Der neue sprechende und suchmaschinenfreundliche Adresspfad lässt sich leichter merken und hat für die Benutzer des Grußkartenversands eine aussagekräftigere Form erhalten.

Was macht denn der Apache Server hierbei genau?

Die Adress-Anfrage wird nach "grusskarte-" untersucht. Durch (.*) wird die Variable "$1" mit allem gefüllt was hinter "grusskarte-" steht (in dem unteren Beispiel "blutpflaume"). Die Variable wird dann in der URL (Uniform Resource Locator (world wide web address)) an "pic=" angehangen und durch "\.JPG" wird der Adresse noch ein .JPG beigefügt.

Und auch hierfür wird die Regel so umgeschrieben, dass die Adresse im Browser lesbar ist.

# Weiterleitung von
# grusskarte/grusskarteschreiben.php?pic=name.JPG
# auf
# grusskarte-name
RewriteCond %{QUERY_STRING} ^grusskarte/grusskarteschreiben.php?pic=(.*)$
RewriteRule ^(.*) http://www.klamonfra.de/grusskarte-%1? [R=301,L]
RewriteRule ^grusskarte-(.*)$ /grusskarte/grusskarteschreiben.php?pic=$1

Fertig! Im folgenden Beispiel wird also aus dem suchmaschinenunfreundlichen Adresspfad:
"http://www.klamonfra.de/grusskarte/grusskarteschreiben.php?pic=blutpflaume.JPG"
... eine suchmaschinenfreundliche Adresse:
"http://www.klamonfra.de/grusskarte-blutpflaume"

Zum Seitenanfang springen Λ