Apache 2.0, mod_rewrite und tote Regexpe nach Update

indy

Der Hutträger
Hallo Leute,

ich betreibe mehrere Apache 2.0 und auf einigen funktionieren nach einem Update auf 2.0.63 Rewrites nach folgendem Schema nicht mehr:

# Regeln Umleitungen der Seiten-Aliase
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteRule ^(.+)? index.php?page=$1 [QSA]

Wenn die beiden Conditions nicht greifen, wurde bisher immer die Regel aktiv.
Laut Log wird sie das auch nach wie vor, allerdings schreibt sie nicht mehr um.
Das Ganze ist unabhängig von den Optionen, die in den eckigen Klammern angegeben werden. Anscheinend matcht das .+ nicht mehr auf den Text, denn der Apache sucht bei einer URL diese im Dateisystem.

Die Konfiguration des Apache ist unverändert, lediglich ein Update auf 2.0.63 hat stattgefunden. Kann das an devel/apr0 liegen?

Ich suche jetzt schon eine Ewigkeit nach einer Lösung und komme hier auf keinen grünen Zweig. Für jede Idee bin ich dankbar.

Beste Grüße

Der Indy
 
Also im 2.2 Apachen kommt folgende Fehlermeldung raus:

%/usr/local/etc/rc.d/apache22 configtest
Performing sanity check on apache22 configuration:
[Wed May 26 09:36:19 2010] [warn] RewriteCond: NoCase option for non-regex pattern '-f' is not supported and will be ignored.
[Wed May 26 09:36:19 2010] [warn] RewriteCond: NoCase option for non-regex pattern '-d' is not supported and will be ignored.


Wird der NC rausgenommen, dann wird nichts mehr moniert.

Zumindest die Doku sagt, dass NC bei solchen Vergleichen keine Wirkung hat, nicht aber, dass es unzulässig ist:

You can also set special flags for CondPattern by appending [flags] as the third argument to the RewriteCond directive, where flags is a comma-separated list of any of the following flags:

* 'nocase|NC' (no case)
This makes the test case-insensitive - differences between 'A-Z' and 'a-z' are ignored, both in the expanded TestString and the CondPattern. This flag is effective only for comparisons between TestString and CondPattern. It has no effect on filesystem and subrequest checks.
Quelle: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

Insofern strange, wenn das vorher ging.
 
Hallo spaulding,

danke für die schnelle Antwort.
Ich verwende Apache 2.0 und wie ich geschrieben habe, wirkt sich eine Änderung an den Flags in den eckigen Klammern leider in keiner Weise aus.

Beste Grüße

Der Indy

Vielleicht hilft eine Zeile aus dem Logfile:

Code:
89.204.153.98 - - [26/May/2010:09:46:49 +0200] [www.site.de/sid#821c4d0][rid#8590050/initial] (3) [per-dir /home/site/www.site.de/htmldoc/] applying pattern '^(.+)?' to uri 'path/to/site/'
89.204.153.98 - - [26/May/2010:09:46:49 +0200] [www.site.de/sid#821c4d0][rid#8590050/initial] (1) [per-dir /home/site/www.site.de/htmldoc/] pass through /home/site/www.site.de/htmldoc/path
Früher wurde path/to/site auf index.php?page=path/to/site umgeschrieben, das passiert jetzt nicht mehr.

Beste Grüße

Der Indy
 
Zuletzt bearbeitet:
Also wenn ich das physikalische Verzeichnis des virtuellen Hosts im Pattern prefixe, dann funktioniert es erstmal (R damit man den Rewrite noch mal im Client sieht):

RewriteEngine On
RewriteLog /var/log/rewrite.log
RewriteLogLevel 5
RewriteCond /hptrr_raid1_0/cust1/phpdemo/%{REQUEST_FILENAME} !-f
RewriteCond /hptrr_raid1_0/cust1/phpdemo/%{REQUEST_FILENAME} !-d
RewriteRule ^/(.+)? /index.php?it=$1 [L,QSA,R]

Edit:
Und da haben sich auch schon andere Leute den Kopf gekratzt: http://serverfault.com/questions/78125/mod-rewrite-request-filename-doesnt-contain-absolute-path

Und in der Tat, die Doku spricht bei REQUEST_FILENAME von einem "The full local filesystem path to the file or script matching the request.", was aber nicht der Fall ist.

192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (2) init rewrite engine with requested uri /phantom
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (3) applying pattern '^/(.+)?' to uri '/phantom'
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (4) RewriteCond: input='/hptrr_raid1_0/cust1/phpdemo//phantom' pattern='!-f' => matched
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (4) RewriteCond: input='/hptrr_raid1_0/cust1/phpdemo//phantom' pattern='!-d' => matched
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (2) rewrite '/phantom' -> '/index.php?it=phantom'
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (3) split uri=/index.php?it=phantom -> uri=/index.php, args=it=phantom
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (2) explicitly forcing redirect with http://phpdemo.home.de/index.php
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (1) escaping http://phpdemo.home.de/index.php for redirect
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#80413f0a0/initial] (1) redirect to http://phpdemo.home.de/index.php?it=phantom [REDIRECT/302]
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#8041430a0/initial] (2) init rewrite engine with requested uri /index.php
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#8041430a0/initial] (3) applying pattern '^/(.+)?' to uri '/index.php'
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#8041430a0/initial] (4) RewriteCond: input='/hptrr_raid1_0/cust1/phpdemo//index.php' pattern='!-f' => not-matched
192.168.177.1 - - [26/May/2010:13:05:18 +0200] [phpdemo.home.de/sid#80409fd40][rid#8041430a0/initial] (1) pass through /index.php
 
Zuletzt bearbeitet:
Und wenn ich jetzt die 2.2 Doku nachschlage (http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond) dann steht dort:

REQUEST_FILENAME
The full local filesystem path to the file or script matching the request, if this has already been determined by the server at the time REQUEST_FILENAME is referenced. Otherwise, such as when used in virtual host context, the same value as REQUEST_URI.

Und dann stimmt wieder alles für meine Verhältnisse, da ich nicht den 2.0er benutze.
 
Hallo,

so weit so gut, danke für deine Recherche.
Die Conditions sind nicht das Problem, die matchen ja.
Das Problem liegt in der Rewrite-Rule, die zwar ausgeführt wird (laut rewrite-log) aber nicht das erwünschte Resultat erzielt.

Beste Grüße

Der Indy
 
Es ist definitiv ein Problem mit den regulären Ausdrücken, denn diese RewriteRule funktioniert wunderbar:
Code:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Ich kann dich morgen gerne mal auf die Kiste schauen lassen.
Eventuell findest du mehr als ich...

Beste Grüße

Der Indy
 
Zurück
Oben