Astoria: mod_rewrite

Hallo,

ich hab schon Stunden im Internet und im Archiv dieses Forums gesucht, ich komm einfach nicht weiter.

Möchte die URI http://www.beispiel.de/dingens/xyz auf die URI http://www.beispiel.de/katalog.php?Title=xyz umleiten lassen. Hier der Inhalt meiner .htaccess-Datei:

RewriteEngine on  
Options +FollowSymlinks  
RewriteRule ^/dingens/(.+)$ /katalog.php?Title=$1  

Funktioniert soweit schon. Allerdings schickt der Webserver respektive das Modul mod_rewrite alle neu geschriebenen URIs nochmal durch die Regeln und vermurxt dann alles. Auch alle Bilder, CSS- und JS-Dateien (die alle relativ referenziert sind) werden dann umgeleitet und sehen danach so aus:

http://www.beispiel.de/katalog.php?Title=css/print.css

Im Logfile findet sich dann sowas wie:

add path info postfix: C:/Internet/wwwroot/beispiel.de/dingens -> C:/Internet/wwwroot/beispiel.de/dingens/css/screen.css

was natürlich zu einem Http-Statuscode 404 führt.

Muss ich jede Datei und jeden Ordner als RewriteCondition pflegen, damit das nicht passiert oder wie geht das sonst?

Danke.

  1. Hi,

    RewriteEngine on
    Options +FollowSymlinks
    RewriteRule ^/dingens/(.+)$ /katalog.php?Title=$1

    Funktioniert soweit schon. Allerdings schickt der Webserver respektive das Modul mod_rewrite alle neu geschriebenen URIs nochmal durch die Regeln

    Das ist ganz normal, wenn man es per .htaccess konfiguriert.

    Muss ich jede Datei und jeden Ordner als RewriteCondition pflegen, damit das nicht passiert oder wie geht das sonst?

    Das einfachste dürfte sein, eine RewriteCond vorzuschalten, die den REQUEST_FILENAME darauf prüft, ob er eine physisch existierende Datei darstellt.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hallo,

      Das einfachste dürfte sein, eine RewriteCond vorzuschalten, die den REQUEST_FILENAME darauf prüft, ob er eine physisch existierende Datei darstellt.

      schon probiert, mit

      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d

      aus dem Thread http://forum.de.selfhtml.org/archiv/2009/1/t182042/#m1204362

      hat aber nicht funktioniert, daher habe ich es aus der obigen Problembeschreibung entfernt

      1. RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d

        Fürs Protokoll: !-l ist auch nicht verkehrt, zwar nicht unter Windows - aber allgemein.

        1. RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d

          Fürs Protokoll: !-l ist auch nicht verkehrt, zwar nicht unter Windows - aber allgemein.

          Aber auch nur, wenn du wirklich symbolische Links verwendest. Sonst ist es eine unnötige Dateisystemoperation in Form eines stat().

  2. Im Logfile findet sich dann sowas wie:

    add path info postfix: C:/Internet/wwwroot/beispiel.de/dingens -> C:/Internet/wwwroot/beispiel.de/dingens/css/screen.css

    Das passiert aber nicht durch deine RewriteRule. Wenn der Client /dingens/css/screen.css anfordert und der Ordner .....beispiel.de/dingens/css/ nicht existiert, kommt genau das bei raus.

    Prüfe also einmal deine HTML-Referenzierungen, ob du auch weiterhin auf die korrekte URI referenzierst.

    Hint: Du befindest dich jetzt in der Ebene /dingens/, um da wieder rauszukommen müsstest du bei einer relativen Referenzierung ="../css/screen.css" notieren.