Nudge am 01.05.2009

korrektes Redirect mit 301 Moved Permanently

in PHP, Tipp, Web | Tags: .htaccess, 301, Apache, PHP, Redirect, Rewrite

Da Domains von Zeit zu Zeit umziehen, ist es wichtig, einem Besucher mit der alten URL zu sagen, wohin der Inhalt gewechselt hat. Dafür sollte man nicht einfach einen Satz wie “Du findest das jetzt hier.” in die alte Seite klatschen. Das ist häßlich und benutzer-unfreundlich. Javascript-Reloads finde ich ebenso unschön, die weil nicht jeder Javascript hat. Und es ist auch nicht besonders erklecklich, 10 Sekunden auf einen ablaufenden Timer zu starren, weil auch langsame Leser bedacht wurden. 😉

Am besten führt man den Besucher also gleich an die richtige Stelle. Und dieser Mechanismus heißt Redirect. Mit einfachen Boardmitteln (entweder in der .htaccess mit mod_rewrite oder mit PHP), die man auf fast allen Webservern findet, lässt sich ein Redirect in Sekundenschnelle einbauen. Ich vergesse auch immer wieder, wie man einen korrekten Redirect setzt. Und dann stückele ich mir das zusammen. Deswegen hier ein PHP-Script zur Zusammenfassung:

1
2
3
4
5
6
<?php
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: http://www.neue-domain.de/");
   header("Connection: close");
   exit();
?>
<?php
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: http://www.neue-domain.de/");
   header("Connection: close");
   exit();
?>

Gut ist es, den Redirect mit Status 301 (permanent) zu setzen, ein 302 (temporär) könnte bei Suchmaschinen schnell nach hinten los gehen. Das PHP-Schnippselchen wird einfach an den Anfang der alten Webseite gesetzt. Wichtig: Davor darf wirklich gar nichts über den Äther gegangen sein. Auch keine Leerzeilen – sonst greifen die HTTP-Header-Angaben nicht.

301 Redirect in der .htaccess

Ein anderer Mechanismus nutzt die Fähigkeiten des Webservers. Für einen Apache-Webserver macht man einen Verweis über einen Eintrag in der Datei .htaccess im Document-Root-Verzeichnis der alten Domain. Dort gibt man dem Rewrite-Modul eine Regel (RewriteRule) mit, welche aus der alten URL eine neue schreibt:

1
2
3
4
5
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ http://www.neue-domain.de/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ http://www.neue-domain.de/$1 [R=301,L]
</IfModule>

Zuerst der linke Teil: Die Regel ^(.*)$ bedeutet: Alle angesprochenen Unterseiten .* zwischen Anfang ^ und Ende $ sollen der neuen Domain übergeben werden. Deswegen die Klammer darum. So kann im zweiten Teil der Regel mit $1 auf die erste Klammer der linken Regel Bezug genommen werden. Dadurch wird zum Beispiel aus http://www.alte-domain.de/start.php ein Verweis auf http://www.neue-domain.de/start.php.

Der Schalter [R=301] setzt wieder den Permantenten Redirect (das verstehen die Suchmaschinen und ändern ihre Einträge). Dabei signalisiert [L], das es sich bitte um die letzte anzuwendende Regel handelt, danach soll Apache bitte mit Rewriting aufhören. Meistens ist er brav und tut das dann auch. 🙂


Das mark ich mir: Alltagz Mr Wong Yigg Del.icio.us Yahoo MyWeb Blinklist Google folkd
 

6 responses to “korrektes Redirect mit 301 Moved Permanently”

  1. Nudge says:

    Wenn dein Provider dir Rewrite-Rules erlaubt, hast du in der .htaccess alle Möglichkeiten offen:

    a) Seite komplett von einem alten Host auf einen neuen Host umziehen:
    RewriteCond %{HTTP_HOST} ^alter\.host\.de$ [NC]
    RewriteRule ^(.*)$ http://neuer.host.de/$1 [R=301,L]

    Man beachte die Maskierung der Punkte im Muster oben vs. einfache Punkte in der Auflösung unten.

    b) nur eine spezielle Seite umleiten:
    RewriteRule ^alteSeite\.html$ neueSeite.html [R=301,QSA,L]
    oder auch
    RewriteRule ^alteSeite\.html$ http://neuer.host.de/neueSeite.html [R=301,QSA,L]

    Ein Beispiel habe ich hier auf http://www.lieber-linux.de/test.html umgesetzt, welches Euch sofort zu einer größeren Suchmaschine per 301-Redirect umleitet und dabei auch Eure Parameter mitnimmt.

  2. Thomas says:

    Und was mache ich mit .html Seiten?

    Danke fuer einen Tipp.

    Thomas

  3. Gastronomie says:

    Hi,

    funktioniert bei mir problemlos!
    Habe als Provider 1und1 und das große Hosting-Paket.

    Vielen Dank für den Tipp!

  4. Nudge says:

    Ja, das Problem kenne ich 🙂

  5. Haschek says:

    Und dann gibt es ja noch das gute alte Apache Redirect temp|permanent|… (z.B. wenn das mod_rewrite nicht richtig funzt, kennst du ja 🙂 )

  6. DonTermi says:

    Diese “diesen Inhalt findest Du jetzt hier” Seiten sind sowieso für den Müll wenn es um Suchmaschinen geht. Diese benötigen eine eindeutige 301 Angabe wenn der Inhalt vollständig für immer verschoben wurde. Zumindest geht man damit auf Nummer sicher das die bisher vorhandenen Inhalte schnellstens auf die neue URL umgeschrieben werden und man nimmt seine Pagerank Punkte mit.

Leave a Reply

Your email address will not be published. Required fields are marked *