Colorscheme

Webdesign Guide - ModRewrite und HtAccess


Warum ModRewrite?
Bevor ich darauf eingehe was ModRewrite ist, erstmal warum wir es brauchen: Wenn man mit PHP programmiert, so will man häufig die Funktion in einem Skript mit einem gewissen Wert ausführen, zum Beispiel wenn die Webanwendung ein Menü hat, dann kann man das folgendermaßen realisieren:

<ul>
<li><a href="index.php?menue=profile">Profil</a></li>
<li><a href="index.php?menue=send_message">Nachricht verschicken</a></li>
<li><a href="index.php?menue=user_overview">Benutzerübersicht</a></li>
</ul>

Wird einer dieser Links angeklickt, wird das Skript mit Namen “index.php” aufgerufen und die Variable, mit Namen “menue”, mit einem Wert belegt (entweder “profile”, “send_message” oder “user_overview”). Diesen Wert kann man nun im Zielskript (index.php) abfangen und verwerten. Sprich, wird der Menüpunkt “Profil” angeklickt, zeigt man auf der Folgeseite das Profil des angemeldeten Benutzers an usw.

Nun funktioniert das alles ganz gut, doch handelt es sich bei solchen Links (index.php?menue=abcxyz) nicht um Suchmaschinen-optimierte URL’s. Dabei ist diese Variante noch harmlos, es geht noch krasser (index.php?wert1=dhdh&wert2=jfjjjf&wert3=3663&wert4=sjj223&wert5=….).

Wenn diese “PHP-URL’s” nicht zu empfehlen sind, was will dann Google und die anderen haben? Sowas hier:

<ul>
<li><a href="/profile">Profil</a></li>
<li><a href="/send_message">Nachricht verschicken</a></li>
<li><a href="/user_overview">Benutzerübersicht</a></li>
</ul>

Erkennt man die Änderung? Wer einen Blog laufen hat der Suchmaschinen-optimierte Links unterstützt, dem kommt diese Form wahrscheinlich bekannter vor, das wollen wir auch für alle Links in unserer Webanwendung erreichen und dazu brauchen wir ModRewrite und htaccess.

Was ist ModRewrite?
Mod Rewrite ist ein Teil der Rewrite Engine vom Apache Webserver. Mit dieser ist möglich suchmaschinen-optimierte Links, wie wir sie oben im Beispiel vorfinden, wieder nach PHP-fähige Links umzuschreiben, damit der Server auch weiß welches Skript er aufrufen muss und welche Variablen & Werte er an dieses übergeben muss. Der Apache Server braucht PHP-typische URL’s und kommt mit unseren optimierten Links nicht zurecht, darum schleusen wir alle Links, bevor sie an den Webserver zur Verarbeitung kommen, erstmal durch unsere Rewrite Engine.

ModRewrite einrichten

  1. Prüfen ob Mod Rewrite aktiviert ist - Als erstes sollten wir natürlich prüfen ob unser Webserver das überhaupt kann, manche haben dieses Modul nämlich nicht aktiviert, kommt allerdings eher selten vor. Dazu verbinden wir uns mit unserem Webserver und legen im Root-Verzeichnis eine Datei mit dem Namen: “infophp.php” an. In diese fügen wir folgenden Quellcode ein:

    <?php
    PHPINFO();
    ?>

    Danach speichern und die Datei wieder hochladen und im Browser diese PHP-Datei aufrufen. Nun sollte euch angezeigt werden, wie euer Apache Server konfiguriert ist und was er alles kann. Sucht nun mit dem Suchtool des Browsers nach “mod_rewrite“, sollte dieses unter dem Punkt “Loaded Modules” aufgeführt sein, dann ist Mod Rewrite bei euch aktiviert.

  2. .htaccess-Datei anlegen - einfach im root-Verzeichnis eures Servers eine Datei mit folgendem Namen anlegen “.htaccess“. An dem führenden Punkt vor dem Dateinamen erkennt man das es sich hierbei nicht um eine gewöhnliche PHP- oder HTML-Datei handelt, sondern um eine Datei die vom Apacher-Server gelesen und verwertet wird (bzw. von der Rewrite-Engine).
  3. .htaccess mit Inhalt füllen - bevor wir die eigentlichen Rewrite-Regeln in unsere htAccess-Datei packen müssen wir erstmal wissen wie unsere Seitenstruktur aussehen wird. Wir haben uns schon in der index.php entschieden das alle wichtigen Module unmittelbar nach der Domain aufgerufen werden, also:
    - http://domain.de/index.php?action=register => Modul-Registrieren
    - http://domain.de/index.php?action=profile => Modul-Profil
    - usw.

    Wir wollen also das unsere Links folgendermaßen aussehen:
    http://domain.de/profile,
    aber von der Rewrite-Engine ins folgendes Format umgeschrieben werden:
    http://domain.de/index.php?action=profile

    und wie das geht steht man im folgenden Part.

Erste Mod_Rewrite-Regeln
Der Besucher unserer Webanwendung findet also folgenden Link vor:
<a href="/profile">Profil</a>

und erwartet das er nach dem anklicken auf der Profilseite landet. Damit das geschieht muss unsere Datei “index.php” für die Variable “$action” den Wert “profile” erhalten, damit das so ist schreiben wir ans Ende unserer .htaccess-Datei folgenden Code:

RewriteBase /
RewriteRule ^([0-9a-zA-Z]+)$ index.php?action=$1

Zur Regel:

  • RewriteBase sagt wo die URL-Umschreibung starten soll, hier kann man auch einen Unterordner angeben, wir wollen aber das ausgehend vom Root die URL’s umgeschrieben werden
  • RewriteRule sagt das unsere Regel jetzt startet
  • ^ hier beginnt die Regel
  • $ hier endet die Regel
  • ([0-9a-zA-Z]+) diese Zeichenkette sagt aus: akzeptiere jegliche Zeichenkombination bestehend aus Zahl (0-9), Kleinbuchstaben (a-z) und Großbuchstaben (A-Z). Das “+”-Zeichen dahinter besagt: akzeptiere einen oder mehrere Zeichen die der vorher angegebenen Zeichenkombination entsprechen. Mit dieser Regel wären folgende URL’s möglich (aber nicht zwangsweise sinnvoll):
    - http://domain.de/asdaskjd
    - http://domain.de/ZEWRHWE
    - http://domain.de/838293
    - http://domain.de/fhjdDFsjdfDDF
    - http://domain.de/87SDsdsjkd83
  • index.php?action=$1 dieser Bereich sagt aus: rufe die Datei “index.php” auf und übergib der Variablen “action” den Wert, welcher den Regeln entsprochen hat. Damit wird die URL erfolgreich umgeschrieben und auch der Wert an das Skript gesendet ohne das der Besucher davon etwas mitbekommt

Dies ist erst eine Rewrite-Regel mit der wir aber schon einen großen Effekt erzielen, alle Hauptmodule lassen sich nun, unter suchmaschinen-optimierten Bedingungen, aufrufen. Sollte unsere .htaccess-Datei im Laufe des Webdesign-Guides noch weitere Regeln benötigen, werden diese an entsprechender Stelle ergänzt.

Kleiner Eingriff gegen Duplicate Content
Da wir schon gerade in der htaccess-Datei rumfuschen, können wir auch noch schnell einen Handgriff tätigen um “duplicate Content” innerhalb unserer eigenen Webanwendung zu verhindern. Den Code einfach an den Anfang der htaccess-Datei einfügen und “domain” durch deinen Domainnamen ersetzen:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.de$ [NC]
RewriteRule ^(.*) http://domain.de/$1 [L,R=301]

Ohne diesen Code läßt sich die eigene Webanwendung mittels:
- http://www.domain.de
und
- http://domain.de
was dazu führen kann das auch der Google-Bot die Domain doppelt besucht und den Inhalt doppelt indexiert, was zwangsläufig zu duplicate Content führt und das wiederum zu einer eventuell schlechteren Suchmaschinen-Platzierung.

weiterführende Links
- http://www.webmaster-toolkit.com/mod_rewrite-rewriterule-generator.shtml - automatisch die Rewrite Regeln erzeugen lassen
- http://www.ilovejackdaniels.com/apache/mod_rewrite-cheat-sheet/ - dies ist das Mod Rewrite Cheat Sheet und enthält nahezu alles was mit Mod Rewrite möglich ist in einer geordneten übersichtlichen Form
- http://httpd.apache.org/docs/2.0/misc/rewriteguide.html#ToC4 - Mod-Rewrite Guide mit vielen Beispielen und guten Erklärungen
- http://www.modrewrite.de/ - Last but not least das deutsche Mod_Rewrite-Forum


Verwandte Artikel
  1. Webdesign Guide - Programmieren einer eigenen Web-Anwendung mit PHP, MySQL, Smarty, Pear, ModRewrite
  2. Webdesign Guide - Awakening the biest
  3. Mit HtAccess Domainweiterleitung bei unterschiedlicher TLD
  4. Webdesign Guide - User-Modul: Login
  5. Webdesign Guide - Modul: Kontaktformular und Dankesseite

am Dezember 11, 2006 um 13:46 Uhr | in Webdesign | 13 Kommentare

6 Trackbacks/Pingbacks
  1. Pingback: Website vor unliebsamen Besuchern schützen mittels htaccess on Dezember 11, 2006
  2. Pingback: Webdesign Guide - Programmieren einer eigenen Web-Anwendung mit PHP, MySQL, Smarty, Pear, ModRewrite » Webdesignblog on Dezember 16, 2006
  3. Pingback: Dublicate Content vermeiden mit ModRewrite und HtAccess @ Brandt Aktuell on Dezember 17, 2006
  4. Pingback: Dublicate Content vermeiden mit ModRewrite und HtAccess @ Brandt Aktuell on März 8, 2007
  5. Pingback: Dublicate Content vermeiden mit ModRewrite und HtAccess » Brandt Aktuell on Januar 10, 2008
  6. Pingback: Doppelter Inhalt - Duplicate Content vermeiden « Suchmaschinen on März 22, 2008

7 Kommentare
  1. Stefan, Dezember 11, 2006:

    Für alle die Christans Spaß auf lokalem Space (Apache, XAMPP) und nicht auf einem Webserver austesten sei gesagt: Wenn ihr Windoof benutzt und die .htaccess Datei angelegt habt bekommt ihr immer einen Fehler im Browser - das liegt an Windoof und nicht an eurem Code :), erspart vielleicht viel Sucharbeit. Umgehen lässt sich das leider nicht :(.

    Und vielleicht eine Frage: wäre es nicht besser statt href=”/bla” lieber href=”bla.html” zu nehmen? Immerhin sieht das eine wie ein Ordner aus und das andere wie eine HTML Datei, und Suchbots schätzen doch statische (HTML…) Dateien?! Oder ist Big G das egal?

  2. Christian Strang, Dezember 11, 2006:

    Danke für den Hinweis!!

    Ob “/bla” schlechter oder besser als “bla.html” ist kann ich leider nicht sagen, vielleicht meldet sich dazu ein SEO zu Wort?

  3. Dave, Dezember 12, 2006:

    “/bla” und “bla.htm” haben 2 Unterschiede:

    der Slash von “/bla” hat zur Folge, dass der Link überall funktioniert, auch wenn per mod-rewrite später vorgegaukelt werden sollte, die Seite befindet sich in
    “domain.de/kontakt/formular/”, würde der Link korrekt auf “domain.de/bla” verlinken, “bla.htm” würde in dem Fall auf “domain.de/kontakt/bla.htm” verlinken, was zu einem Fehler führen würde (wenn keine base angegeben wird).

    Die .htm Endung kann in den Suchergebnissen besser aussehen, wie Google das bewertet kann ich aber auch nicht sagen. Allerdings wird es problematisch, wenn man noch tiefere Ebenen hinzufügen möchte - mit der “virtuellen Ordnerstruktur” ist das kein Problem, da kann aus “/bla” auch mal “/bla/blub” werden.
    “bla.htm/blub/” ist ziemlich irreführend, und “bla-blub.htm” kann bei (vor allem wenn noch mehrere Ebenen dazukommen) nicht mehr so einfach als Hierarchie erkannt werden.

    Ich tendiere immer zur “virtuellen Ordnerstruktur”, allerdings muss man natürlich aufpassen, dass alle Links (auch Bilder, CSS, usw.) korrekt angegeben werden.

  4. Syndrom, Dezember 30, 2006:

    Danke für die einfach gehaltene tut, durch ihre hilfe wirds es bald schönere adressen geben, jedenfalls auf der half life 2 mods seite

  5. Enrico, Januar 2, 2007:

    @Stefan: ICh hatte auch die gesamte Zeit Probleme die modrewrite-Engine ans Laufen zu bekommen, bis ich “RewriteEngine on” noch eingefügt habe.

    Mein Code sieht jetzt folgender Maßen aus:

    #### Regeln zum Umschreiben der URL ####
    RewriteEngine on
    RewriteBase /projekte/webdesign_guide/
    RewriteRule ^([0-9a-zA-Z]+)$ index.php?action=$1

  6. Christian Strang, Januar 2, 2007:

    Oh sorry, darauf hätte ich wohl mal hinweisen sollen, ich hab das schon oft gelesen aber selbst nie gebracht. Danke für die Info!!

  7. Francesco Schwarz, Januar 8, 2009:

    Vielen, vielen Dank für diesen Artikel. Nach stundenlanger Suche in den weiten Weiten des Internet endlich mal brauch- und umsetzbare Hinweise!

Tut mir leid, die Kommentarfunktion für diesen Beitrag ist geschlossen.