publish and discover academic work ...

Wie funktioniert mod_rewrite

mod_rewrite ist ein von beliebten Modulen. Meine Erfahrung zeigt, dass die einfachste Aufgaben ohne große Probleme gelöst werden, da es für das Modul viel genug Tutorials gibt. Das ist die gute Nachricht, die schlechte ist, dass so bald etwas nicht Triviales gemacht werden soll, sucht man nach Lösung mit Hilfe von Ausprobieren. Der Grund dafür, man versteht einfach nicht wie mod_rewrite funktioniert. In diesem Artikel möchte ich versuchen diese Lücke zu decken.

Womit arbeitet RewriteRule?


Die erste RewriteRule bekommt den relativen Pfad zu angeforderter Datei, und zwar realiv zum Ordner, wo der .htaccess liegt. Der Pfad fängt nie mit "/". Jede weitere RewriteRule bekommt das Ergebnis von früheren RewriteRule’s.

Das ist ganz wichtiges Moment, mod_rewrite arbeitet nicht mit Links sondern mit Pfaden. Der Grund dafür ist einfach, das kann so passieren, dass mod_rewrite schon Ergebnis von anderen Modulen (z.B. mod_alias ) bekommen kann und der Link mit Pfad einfach nicht mehr übereinstimmt. Wenn RewriteRule mit Links arbeiten würde, könnte er die Ergebnisse von anderen Modulen kaputtmachen.

Beispiel:

Anfrage: example.com/templates/silver/images/logo.gif
DocumentRoot: /var/www/example.com
Pfad zur Datei: /var/www/example.com/templates/silver/images/logo.gif
.htaccess befindet sich in: /var/www/example.com/templates/.htaccess
Die erste RewriteRule bekommt: silver/images/logo.gif
Anmerkung: «templates/» wurde auch entfernt.



Es gelten folgende Regeln, RewriteRule arbeitet mit dem Name der Seite und mit Argumenten für Scripts nicht! Das macht RewriteCond, die wir ein bisschen später betrachten.

Beispiele:

# das wird nicht funktionieren, da am Anfang „ /“ steht
 RewriteRule ^/index.php$ /my-index.php

 # das wird nicht funktionieren, da der Name vernachlässigt wird RewriteRule
 RewriteRule ^example.com/.* http://www.example.com

 # das wird nicht funktionieren, da  RewriteRule mit Argumenten nicht arbeitet
 RewriteRule index.php\?newspage=([0-9]+) news.php?page=$1

 # das wird nur dann funktionieren, wenn  .htaccess in dem selben Ordner mit templates liegt,
 # z.B. im Wurzel der Seite. Z.B. wenn  .htaccess liegt in templates/.htaccess , die Regeln 
 # wird NICHT funktionieren, da mod_rewrite den Teil von Pfades  bis  .htaccess abschneidet  RewriteRule
 # und die Regeln bekommt den Pfad ohne  "templates/"

 RewriteRule ^templates/common/yandex-money.gif$ templates/shared/yad.gif


Jetzt wissen wir womit RewriteRule arbeitet. Der nächste Schritt ist zu erkennen, wie sie arbeitet.
Im Prinzip ist RewriteRule nur ein Parser von Regular Expressions. Passiert folgendes.

  • Der Pfad ist nur ein String
  • Man nimmt das erste Argument und sucht man in der String
  • Falls eine Übereinstimmung gefunden wurde, wird die ganze String durch das zweite Argument ersetzt.
  • Das Ergebnis wird an nächste RewriteRule übergeben

Beispiel:

# Anfrage: http://mysite.com/info.html
 # die erste  RewriteRule bekommt  "info.html"

 # wir ersetzen die String durch eine andere
 RewriteRule ^info.html$ "I saw a turtle in the hole. And it was dancing rock-n-roll. And it was smiling. All in all, it was a very funny doll."

 # "info.html" -> "I saw a turtle..."

 # wird durch ein URL ersetzt 
 RewriteRule turtle https://example.com/information/index.html

 # "I saw a turtle..." -> "https://example.com/information/index.html"

 # ändern des Names von Seite!
 RewriteRule ^(.*)example.com(.*)$ $1example.org$2

 # "https://example.com/information/index.html" -> "https://example.org/information/index.html"

 # ändern von Protokoll!
 RewriteRule ^https:(.*)$ ftp:$1

 # "https://example.org/information/index.html" -> "ftp://example.org/information/index.html"

 # ändern von Zieldatei.
 RewriteRule ^(.*)/index.html$ $1/main.php
 # "ftp://example.org/information/index.html" -> "ftp://example.org/information/main.php"


Wie Sie sehen, RewriteRule macht nichts Besonderes. Wenn Sie mit Regular Expressions klar kommen, können Sie mit Hilfe RewriteRule alles machen was Ihre Fantasie erlaubt.

Nachdem die letzte RewriteRule bearbeitet wurde, kommt RewriteBase ins Speil, darüber aber in nächstem Artikel.
  • cron cron,
  • 12 März 2013, 00:08
  • 0

Kommentare (0)

RSS zusammenklappen / ausklappen

Kommentar schreiben

Ihr Name
Sie sind ein Gast, Sie dürfen keine HTML-Tags verwenden
Bitte geben Sie die Zeichen in das folgende Feld ein