Stephan B.: Probleme mit mod_rewrite

Hi zusammen,

ich habe ein kleines Problem mit mod_rewrite (soll laut Angaben geladen und funktionsfähig sein).

www.beispiel.org/bilder/bild.php?a=bildname&b=kat
soll erreichbar sein unter
www.beispiel.org/gross/kat/bildname.jpg

und

www.beispiel.org/bilder/kat/bildname-klein.jpg
unter
www.beispiel.org/klein/kat/bildname.jpg

Nun habe ich folgende .htaccess im Hauptverzeichnis:

----->
RewriteEngine on

RewriteCond %{REQUEST_URI} ^/gross/(.+?)/(.+).jpg$
RewriteRule ^gross/(.+?)/(.+).jpg$ bilder/bild.php?a=$2&b=$1

RewriteCond %{REQUEST_URI} ^/klein/(.+?)/(.+).jpg$
RewriteRule ^klein/(.+?)/(.+).jpg$ bilder/$1/$2-klein.jpg
<-----

doch irgendwie will es nicht funktionieren,
wo steckt mein fehler?

  1. Hallo Stephan,

    RewriteCond %{REQUEST_URI} ^/gross/(.+?)/(.+).jpg$
    RewriteRule ^gross/(.+?)/(.+).jpg$ bilder/bild.php?a=$2&b=$1

    auf meinem System (Linux, Apache 2.x) funktioniert das einwandfrei.

    doch irgendwie will es nicht funktionieren,
    wo steckt mein fehler?

    Vielleicht willst du uns mal sagen welche Software du einsetzt? (Apache 1.x oder Apache 2.x etc.)
    Die Aussage "es funktioniert nicht" hilft zur Fehlerfindung kein bisschen weiter.
    Versuche zu beschreiben welche Schritte du probiert hast und wo du stehen geblieben bist bzw. was für Fehler wo angezeigt wurden.

    Hilfreich sind Ausschnitte aus diversen Logdateien.
    Bei Apache ist das Errorlog relevant, welches z.B. unter /var/log/apache2/error_log zu finden ist.

    Das Logging von mod_rewrite kannst du mit folgenden Direktiven einschalten:
    RewriteLog /path/to/log/file
    RewriteLogLevel 0-9
    Achtung: ein zu hohes Level erzeugt viel zu viel Ausgaben :)

    Gruß,
    Benne

    --
    ie:% fl:( br:> va:) ls:> fo:| rl:° ss:) de:[ js:| ch:| mo:} zu:)
    1. Auf meinem Apache-Server zu Hause lief es auch, nur online nicht.
      So funktioniert es jetzt:

      RewriteEngine on

      RewriteCond %{REQUEST_URI} gross/(.+)/(.+).jpg$
      RewriteRule gross/(.+)/(.+).jpg$ /bilder/bild.php?a=$2&b=$1

      RewriteCond %{REQUEST_URI} klein/(.+)/(.+).jpg$
      RewriteRule klein/(.+)/(.+).jpg$ /bilder/$1/$2-klein.jpg

  2. Hi,

    [...]

    wo steckt mein fehler?

    Vermutlich hierin:

    1. Vorwärts-slashes müssen nicht escaped werden:
       Also solltest du wohl '/' schreiben statt '/'.

    2. Nicht zuletzt ein performance-Gesichtspunkt:
       _Ein_ regulärer Ausdruck mit Klammern reicht meistens.
       Auf die Klammerausdrücke der letzten RewriteCond kannst du in der RewriteRule mittels %N(1 <= N <= 9) zugreifen.

    3. (.+?) soll wohl erlaubt sein; trotzdem ist es meist besser,
       entweder
       (.+) für: _mindstens_ ein beliebiges Zeichen
       oder
       (.?) für: ein _oder_ kein Zeichen.
       zu verwenden.

    (Ersteres wäre aber immer noch recht ungenau - denn '/' ist darin ja noch erlaubt.)

    Daher versuch es mal mit:

    RewriteEngine On

    RewriteCond %{REQUEST_URI} ^/gross/([^/]+)/([^/]+).jpg$
    RewriteRule ^.*$  bilder/bild.php?a=%2&b=%1

    RewriteCond %{REQUEST_URI} ^/klein/([^/]+)/([^/]+).jpg$
    RewriteRule ^.*$  bilder/%1/%2-klein.jpg

    Freundliche Grüße,
    Sancho

  3. Moin!

    Nun habe ich folgende .htaccess im Hauptverzeichnis:

    ----->
    RewriteEngine on

    RewriteCond %{REQUEST_URI} ^/gross/(.+?)/(.+).jpg$
    RewriteRule ^gross/(.+?)/(.+).jpg$ bilder/bild.php?a=$2&b=$1

    RewriteCond %{REQUEST_URI} ^/klein/(.+?)/(.+).jpg$
    RewriteRule ^klein/(.+?)/(.+).jpg$ bilder/$1/$2-klein.jpg
    <-----

    Warum hast du das RewriteCond drin?

    mod_rewrite prüft zuallererst, ob der bei RewriteRule angegebene reguläre Ausdruck auf die aktuelle URL zutrifft.

    NUR DANN wird bei eventuell vorhandenen RewriteCond geprüft, ob diese ebenfalls zutreffen.

    Ohne RewriteCond, oder wenn diese zutreffen, wird direkt der zweite Ausdruck bei RewriteRule als neue URL erzeugt.

    Wenn du also einen regulären Ausdruck für das URL-Muster hast, brauchst du nicht denselben Ausdruck nochmal in einer RewriteCond gegen REQUEST_URI zu prüfen - das erledigt RewriteRule automatisch. RewriteCond ist dazu da, ZUSÄTZLICHE Bedingungen zu prüfen.

    Beispiel: Deine aufgerufene URL ist /album/bild.jpg. Mit RewriteRule soll daraus /script/bildlieferer.php?pic=bild.jpg werden, aber NUR, wenn das Bild tatsächlich im Verzeichnis bilder/groß/bild.jpg existiert. Nur dann ist eine RewriteCond notwendig, die die Existenz der Datei prüft.

    Anderes Szenario: Eine Rewrite-Rule soll den Zugriff auf /css/screen.css nur dann auf screen-ie.css umleiten, wenn ein IE zugreift - also fragt man den User-Agent-String ab (ist zwar böse, das so zu tun, aber als Sinnbeispiel für RewriteCond demonstriert es, wozu diese Anweisung gut ist).

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hallo Sven!

      Warum hast du das RewriteCond drin?
      (...) RewriteCond ist dazu da, ZUSÄTZLICHE Bedingungen zu prüfen.

      Dein Posting ging zwar an den OP - trotzdem:

      Völlig richtig. Vielen Dank für den Hinweis, der es mir 'wie Schuppen aus den Haaren' (O.W.) fallen ließ:

      Was man in den RewriteConds als %{REQUEST_URI} prüfen kann, _ist_ ja gerade das, was ge-'rewrite'-t wird.

      (Lauter Bäume - aber nun ist der Wald wieder sichtbar.)

      Freundliche Grüße,
      Sancho