Hallo seth,
kannst du evtl. auch gerade noch zu </archiv/2008/3/t168072/#m1096583> was sagen? ich war mir da naemlich nicht ganz sicher.
Du hast soeben einen Bug im mod_rewrite-Code für Apache 2.0 gefunden! Gratulation! :-)
http://html-ag.wvs-berlin.de/rewrite/ $1=='/'
Nein, $1 == '' bei mir, sowohl Apache 2.0 als auch 2.2 und auch der Testserver, den Du angegeben hast:
christian@cobalt ~ $ curl -I http://html-ag.wvs-berlin.de/rewrite/ 2>/dev/null | grep Location
Location: http://www.example.com?a=html-ag.wvs-berlin&b=
Das ist aber auch vollkommen in Ordnung und Konsistent mit dem zweiten:
http://html-ag.wvs-berlin.de/rewrite/abc/def $1=='abc/def'
Die dritte Zeile allerdings, die Dein Problem darstellt:
http://html-ag.wvs-berlin.de/rewrite $1=='/var/www/vhosts/html-ag.wvs-berlin.de/httpdocs/rewrite'
Das ist tatsächlich ein Bug!
wie genau kommt sowas zustande?
Vorneweg: mod_rewrite SOLL in der Situation (3) gar nicht aktiv werden. Dort soll erst mod_dir aktiv werden, das nach $VERZEICHNIS + / weiterleitet (hier also nach 'http://html-ag.wvs-berlin.de/rewrite/' weitergeleitet werden) und DORT würde erst mod_rewrite aktiv werden. Kommentar dazu im Sourcecode von mod_rewrite:
/*
* .htaccess file is called before really entering the directory, i.e.:
* URL: http://localhost/foo and .htaccess is located in foo directory
* Ignore such attempts, since they may lead to undefined behaviour.
*/
Nun, was ist passiert?
Am 29. März 2004 (zu der Zeit war Apache 2.0 schon released, Apache 2.2 aber noch nicht, d.h. trunk/ war aktuell der 2.1/2.2-Entwicklungsstand, branches/APACHE_2_0_BRANCH/ der 2.0er-Entwicklungsstand) wurde in den Apache Trunk ein Patch eingespielt, der bei mod_rewrite irgendwas an der Proxy-Geschichte macht, Revision 103199 (ich müsste mich einlesen, um zu sehen, was genau da eigentlich passiert). Dazu wurde folgende if-Bedingung in den trunk/ eingefügt:
if (!is_proxyreq) {
Im Prinzip: Wenn der Request nichts mit Proxy-Requests zu tun hat, dann mach die Überprüfung ob http://localhost/foo aufgerufen wurde (die dann evtl. zum vorzeitigen Abbruch der Verarbeitung führt), ansonsten ist es Dir egal.
Am 26. August 2004 wurde der Patch auf den 2.0er-Branch backportet, siehe Revision 104840. Dort hat sich dann allerdings ein Fehler eingeschlichen, denn die If-Bedingung lautete nun:
if (is_proxyreq) {
Das heißt: Die Überprüfung, die eigentlich für Nicht-Proxy-Requests ausgeführt wird, wird nun nur noch für Proxy-Requests ausgeführt.
Ist natürlich irgendwie extrem doof. ;-)
Da der Patch im trunk/ korrekt war, tritt der Bug in Apache 2.2 natürlich nicht mehr auf.
Workaround
Du kannst mod_rewrite manuell sagen, dass er Requests an das Verzeichnis ohne / am Ende ignorieren soll. Dazu musst Du eine RewriteCond auf das REQUEST_URI einfügen, z.B. so:
RewriteCond %{REQUEST_URI} !^/rewrite(\?|$)
Achja, Du könntest den Bug auch mal melden. Ich bezweifle zwar, dass die Apache-Leute den im Apache 2.0 noch fixen werden (zumal er in 2.2 schon gefixed ist), aber versuchen kann man's mal. Der Testserver liefert allerdings Apache 2.0.53, der ja schon etwas älter ist (2.0.63 ist in der 2.0er-Reihe aktuell), d.h. ob so ein Patch überhaupt etwas bringen würde, ist natürlich die zweite Frage. Bug melden geht hier.
Viele Grüße,
Christian