Apache: mod_rewrite & RegEx mit optionalen Paramter

rephluX

Ensign
Registriert
Okt. 2007
Beiträge
169
Ahoi Forum!

Irgendwie steh ich gerad auf dem Schlauch und finde den Fehler irgendwie nicht. In meiner PHP-Seite werden alle URLs, die auf .html oder .xml enden per mod_rewrite an eine index.php geleitet. Diese bekommt dann als Paramter die gewünschte Seite als Paramter übergeben. Also aus einem

/unternehmen/kontakt.html

wird dann

index.php?page=/unternehmen/kontakt.html

Soweit so gut. Klappt und läuft. Jetzt würd ich aber gern den URLs noch optional einen Parameter übergeben können:

/unternehmen/kontakt.html?foo=bar

Ich hab folgende .htaccess Datei:

Code:
<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d [OR]
    RewriteRule ^(.*).(html|xml)\??(([a-z]+)=([a-z0-9_\-]+))?$ index.php?page=/$1.$2&$4=$5 [L]
</IfModule>

Im RegEx Coach läuft der Ausdruck wunderbar, und alle Submachtes sind richtig befüllt. Wenn ich das ganze im Browser ausprobiere, dann geht lediglich

http://localhost/?foo=bar

und der Parameter foo wird auch korrekt an die index.php übergeben.

Allerdings gehts dann nicht mehr, wenn ich zusätzlich noch eine gewünschte Seite direkt aufrufe. Also z.B

http://localhost/index.html?foo=bar
http://localhost/unternehmen/kontakt.html?foo=bar
http://localhost/impressum.html?foo=bar

Die Aufrufe von mod_rewrite hab ich mal ins log schreiben lassen, und da kommt der optionale Paramter anscheinend gar nicht an:

Code:
(2) init rewrite engine with requested uri /index.html
(1) pass through /index.html
(3) [perdir /var/htdocs/] strip per-dir prefix: /var/htdocs/index.html -> index.html
(3) [perdir /var/htdocs/] applying pattern '^(.*).(html|xml)\\??(([a-z]+)=([a-z0-9_\\-]+))?$' to uri 'index.html'
(4) [perdir /var/htdocs/] RewriteCond: input='/var/htdocs/index.html' pattern='!-f' => matched
(4) [perdir /var/htdocs/] RewriteCond: input='/var/htdocs/index.html' pattern='!-d' => matched
(2) [perdir /var/htdocs/] rewrite 'index.html' -> 'index.php?page=/index.html&='
(3) split uri=index.php?page=/index.html&= -> uri=index.php, args=page=/index.html&=

Etwas stuzig macht mich hier die Zeile 4 und die doppelten Escape-Zeichen. Ist das nur die Zeile im Log so? Denn in der htaccess-Datei stehts definitv richtig drin.

Klar, ich könnte das ganze natürlich auch mit zwei Regulären Ausdrücken machen, aber ich würd gerad nur verstehen, wo der Fehler liegt :)

Danke für die Fehlerfindung!
 
So, da keiner Will, schreib ich selbst mal schnell die Lösung ;)

Das Problem bestand darin, dass alle Parameter, die wie normal üblichlich, an eine URL angefügt werden, in mod_rewrite als eben solche behandelt werden. Mit anderen Worten: In der eigentlichen URL sind diese gar nicht enhalten.

Daher muss man noch zusätzlich folgendes in die .htaccess einfügen:

Code:
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*).(html|xml)$ index.php?page=/$1.$2&%1 [L]

Die gesamte .htaccess Datei sieht dann wie folgt aus:

Code:
<IfModule mod_rewrite.c>
   Options +FollowSymlinks
   RewriteEngine On
   RewriteBase /

   RewriteCond %{QUERY_STRING} ^(.*)$
   RewriteRule ^(.*).(html|xml)$ index.php?page=/$1.$2&%1 [L]

   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d [OR]
   RewriteRule ^(.*).(html|xml)$ index.php?page=/$1.$2 [L]
</IfModule>
 
Zurück
Oben