On 03/27/2013 09:51 PM, Lentes, Bernd wrote:
Torsten schrieb:
Wieso zu $DocumentRoot/hallo/ ? Ich verstehe "Alias /test /hallo" so, daß /hallo im Root des Filesystems liegt, damit also zu /hallo umgeleitet wird. Bei diesem Beispiel http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase liegt das Ziel-Directory auch unterhalb der root des filesystems, nicht unterhalb DocumentRoot.
Klar. Hier war ich ein wenig konfus. Alias schreibt natürlich in einen Pfad im Filesystem um. Ursprünglich stand dort auch ServerRoot, was natürlich auch nur stimmt, wenn das Alias Ziel nicht mit einem Slash beginnt. Also vergiss das DocumentRoot Gefasel. Der Rest stimmt aber.
Genau für diesen Zweck hat der Apache einen Mechanismus, der sich "Internal Redirect" nennt. Dabei wird eine neue Request Struktur mit der neuen URI erzeugt. Diese durchläuft den kompletten Zyklus beginnend mit der URI Translation Phase erneut.
Das ist hier gut beschrieben: http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_l Passiert das /immer/, daß das Ergebnis der RewriteRules in einem directory-context wieder an den Anfang (URI translation phase) weiter gegeben wird ?
Ja. Der Grund ist, dass die neue Location andere Zugriffsberechtigungen erfordern kann. Diese werden aber in den sog. AAA Phasen (Access, Authentication und Authorization) geprüft. Die sind in Fixup vorbei. D.h. um erneut zu prüfen, müssen wir zurück auf Anfang.
Außerdem: ist das "[INTERNAL REDIRECT]" im logfile das Zeichen dafür, daß der request noch mal durch alles läuft ? Ich habe nämlich in meinem log "[INTERNAL REDIRECT]"-Einträge, bei denen aber anscheinend danach nichts mehr passiert. Oder matcht da nur einfach nichts, so daß keine Rule angewendet wird ?
Wenn er keine RewriteRules anwendet, kommt auch im RewriteLog nichts an.
================================================================ ... 146.107.x.x - - [27/Mar/2013:15:22:49 +0100] [mouseidgenes.helmholtz-muenchen.de/sid#7f7446a5d838][rid#7f7446ad7958/initial] (2) [perdir /srv/www/vhosts/mouseidgenes/htdocs/] strip document_root prefix: /srv/www/vhosts/mouseidgenes/htdocs/MouseIDGenes -> /MouseIDGenes 146.107.x.x - - [27/Mar/2013:15:22:49 +0100] [mouseidgenes.helmholtz-muenchen.de/sid#7f7446a5d838][rid#7f7446ad7958/initial] (1) [perdir /srv/www/vhosts/mouseidgenes/htdocs/] internal redirect with /MouseIDGenes [INTERNAL REDIRECT]
Anm.: sieht nicht so aus, als ob hier noch was passiert.
Für /MouseIDGenes gibt es offensichtlich keine RewriteRules, bzw. keinen Container, der RewriteRules enthält.
Nun wendet mod_rewrite wieder Deine Rule an und vergleicht "MouseIDGenes" mit der Regexp "$". Es passt, denn auch der String "MouseIDGenes" hat ein Ende.
Muß hier nur ein Zeichen (Wortende) matchen ?
Das habe ich schon beantwortet. RewriteRule ^$ MouseIDGenes würde nur matchen, wenn nach /hallo/ nichts mehr kommt. RewriteRule ^(?!MouseIDGenes)$ MouseIDGenes matcht immer, außer bei /hallo/MouseIDGenes. Hier würde die Rule also auch für /hallo/blub angewendet.
1. Frage:
Mod_rewrite arbeitet eigentlich nur auf dem Filename Feld des Requests. In der URI Translation Phase kann es sein, dass dieses noch nicht gesetzt ist (NULL Pointer). In diesem Fall wird es vor dem Start der Maschine mit r->uri initialisiert. Filename muss dabei nicht einer existierenden Eintrag im Filesystem entsprechen. Es kann eigentlich ein beliebiger String sein.
Substitution in einer RewriteRule ist eigentlich immer ein Pfad im Filesystem (der nicht existieren muss), außer wenn mittels Flags etwas anderes angegeben ist, PT, P oder R. Im Directory-Context wird das PT Flag impliziert. Somit ist Substitution eine URI.
Im Server-Context wird mit dem PT Flag das r->uri Feld geändert, sonst immer r->filename. Im Directory-Context wird ein Internal Redirect mit der neuen URI erzeugt. D.h. es entsteht ein neuer Request mit der neuen URI in r->uri.
Aber erst wenn alle Rules durchlaufen sind, oder ?
Ja freilich. Der Code von mod_rewrite enthält eine Funktion namens apply_rewrite_list. Diese wendet *alle* Rules an, die zur Konfiguration des Requests und zum Context passen. Erst wenn diese Funktion fertig ist, passiert das oben beschriebene.
Hallo Torsten,
noch nie habe ich so eine ausführliche Antwort bekommen. Vielen Dank und Respekt !
Wenn es die Zeit erlaubt, mache ich das schon mal gern. Deine Mail auf users@httpd kam zu einem Zeitpunkt, als ich diese nicht hatte. Außerdem beantworte ich keine Fragen zu distributionsspezifischem Kram, wo die Leute mit den /modernen/, hochgradig zerstückelten Konfigurationsdateien nicht klar kommen. Ich benutze immer meinen eigenen Apache mit einer Konfigurationsdatei und kaum Kommentaren. Da sieht man wenigstens, was passiert. Ich erwarte, dass ein Fragender seine Hausaufgaben gemacht, die Doku gelesen und ggf. schon ein wenig experimentiert hat. Außerdem sollte er ein recht komplettes Bild seines Problems schildern. Du hast in die Kategorie gepasst. Sowas wie, "Wie konfiguriere ich den Apache für besten Durchsatz? Bitte um Ratschläge" beantworte ich nicht. Könnte ich zwar. Aber das ist ein zu komplexes Thema und der Fragende würde die Antwort sowieso nicht verstehen, da er sich vorher nicht damit beschäftigt hat. Mein plötzlicher Fundus an Zeit ist übrigens darin begründet, dass ich ein Opfer der Reutax Geschichte bin. Wenn es also jemanden gibt, der gerade einen Perl/Apache/Linux Spezialisten sucht, könnte er mich finden. Torsten -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org