bert: Flags bei Rewrite

Hi,

wieso funktioniert hier die dritte Zeile nicht?:

RewriteRule ^de/$ /de [R]
RewriteRule ^de$ /index.php
RewriteRule ^de/(.+) /index.php?lang=de&path=$1

erst geht. zweite geht. dritte gibt die index.php komplett ohne Formatierung und Bilder wieder.

Wenn ich allerdings hinter die letzte Zeile [R] schreibe, sodass die neue URL auch im Browser angezeigt wird, dann funktionierts einwandfrei. Wieso? Eigentlich sollte die [R]-Flag doch nur die Anzeige beeinflussen, aber im Hintergrund hat die doch sonst keine Funktion?!
Scheinbar klappen ohne die Flag aber auch die Eibindung von CSS und Pics, die sich in Unterverzeichnissen befinden, nicht mehr. Jemand ne Idee?

  1. Hallo,

    RewriteRule ^de/(.+) /index.php?lang=de&path=$1
    gibt die index.php komplett ohne Formatierung und Bilder wieder.

    wenn du die eingebundenen Bilder und Stylesheets relativ adressierst, ja.

    Dein Browser fordert /de/blah an. Der Server setzt das intern auf /index.php?lang=de&path=blah um.
    In diesem HTML-Dokument wird ein Bild, z.B. logo.png, eingebunden, das relativ adressiert ist. Der Browser fordert es nun unter /de/logo.png an, denn er ist ja überzeugt, auch das HTML-Dokument aus dem Verzeichnis /de abgerufen zu haben.

    Wenn ich allerdings hinter die letzte Zeile [R] schreibe, sodass die neue URL auch im Browser angezeigt wird, dann funktionierts einwandfrei.

    Klar. :-)

    Eigentlich sollte die [R]-Flag doch nur die Anzeige beeinflussen, aber im Hintergrund hat die doch sonst keine Funktion?!

    Oh, da hast du aber etwas *gründlich* missverstanden! Die Anzeige in der Browser-Adresszeile ist nur ein Nebeneffekt. Tatsächlich ist es so, dass beim Rewriting ohne [R] der Server die "Umleitung" ausschließlich intern selbst macht und der Browser nichts davon "weiß", während er mit dem [R] gar nichts in der Art tut, sondern stattdessen nur dem Browser sagt: Versuch's nochmal unter einer anderen Adresse.

    Scheinbar klappen ohne die Flag aber auch die Eibindung von CSS und Pics, die sich in Unterverzeichnissen befinden, nicht mehr. Jemand ne Idee?

    Wenn du ein Rewriting machst, das Verzeichnisse anders erscheinen lässt, solltest du eingebundene Ressourcen immer absolut adressieren (oder konkret ins Rewriting mit einbeziehen).

    So long,
     Martin

    --
    Wie kann es sein, dass ich von 100 Gramm Schokolade zwei Kilo zunehme?
    1. Wenn du ein Rewriting machst, das Verzeichnisse anders erscheinen lässt, solltest du eingebundene Ressourcen immer absolut adressieren (oder konkret ins Rewriting mit einbeziehen).

      Gut zu wissen, habe das Ganze jetzt so geregelt:
      RewriteCond %{SCRIPT_FILENAME} -f
      RewriteRule ^de/(.*).(css|js|png|php) /$1.$2 [L,NC]

      Die beiden Zeilen einfach vor:
      RewriteRule ^de/(.*) /index.php?path=$1 [QSA,L]

      gesetzt. Jetzt funktionierts.

      Vielen Dank für eure Hilfe (geht auch an Beat!) Jetzt habe ich das die RewriteEngine wieder etwas besser verstanden.

    2. Wenn du ein Rewriting machst, das Verzeichnisse anders erscheinen lässt, solltest du eingebundene Ressourcen immer absolut adressieren (oder konkret ins Rewriting mit einbeziehen).

      okay klappt doch nicht..

      also wenn ich auf name.de/de gehe wird die seite ganz normal angezeigt, auch wenn ich kein Rewrite für relativ verlinkte css,js und png angebe.

      wenn ich auf name.de/de/x gehe werden css,js und png rausgeschmisse.

      Naja, meine .htacces sieht jetzt wie folgt aus:

      no index.htm(l)

      RewriteRule ^index.htm$ /de [R]
      RewriteRule ^index.html$ /de [R]

      start with /de

      RewriteRule ^de/$ /de [NC]
      RewriteRule ^de$ /index.php [L,NC]

      allow relative source für png/js/css/pgp

      RewriteCond %{REQUEST_URI} ^(.+)/$
      RewriteRule ^%{REQUEST_URI}(.*).(css|js|png) /$1.php$2 [L,NC]

      RewriteCond %{REQUEST_URI} ^(.+)/$
      RewriteRule ^%{REQUEST_URI}(.*).php(.*) /$1.php$2 [L,NC]

      allow relative source für png/js/css/pgp (wenn kein / am Ende angegeben)

      RewriteCond %{REQUEST_URI} ^(.+)$
      RewriteRule ^%{REQUEST_URI}/(.*).(css|js|png) /$1.php$2 [L,NC]

      RewriteCond %{REQUEST_URI} ^(.+)$
      RewriteRule ^%{REQUEST_URI}/(.*).php(.*) /$1.php$2 [L,NC]

      give uri as $path

      RewriteRule ^de/(.*) /index.php?path=$1 [NC,QSA,L]

      ---------

      Verstehe nicht, warum das jetzt nicht greift. Also nur die 4 Blöcke in der Mitte (### allow relative source...) klappen nicht.

      Wenn ich das jetzt durch absolute Verlinkungen umgehen möchte, gibt es eine angabe für das Hauptverzeichnis, damit ich nicht jedes mal http://www.name.de/css/main.css angeben muss, sondern sowas wie root/css/main.css reicht?
      Also ../wäre ja nur ein Ordner zurück, aber wenn dann die uri text/t/any ist trifft das ja auch wieder nicht zu..

      Danke

      1. Hi,

        okay klappt doch nicht..

        also wenn ich auf name.de/de gehe wird die seite ganz normal angezeigt, auch wenn ich kein Rewrite für relativ verlinkte css,js und png angebe.

        wenn ich auf name.de/de/x gehe werden css,js und png rausgeschmisse.

        Warum das so ist, hat Martin dir gerade vorher an einem einfachen Beispiel verdeutlicht.

        Bemühe dich bitte, die Antworten auch zu *verstehen*.

        Wenn ich das jetzt durch absolute Verlinkungen umgehen möchte, gibt es eine angabe für das Hauptverzeichnis, damit ich nicht jedes mal http://www.name.de/css/main.css angeben muss, sondern sowas wie root/css/main.css reicht?

        http://de.selfhtml.org/html/allgemein/referenzieren.htm

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. wenn ich auf name.de/de/x gehe werden css,js und png rausgeschmisse.

          Warum das so ist, hat Martin dir gerade vorher an einem einfachen Beispiel verdeutlicht.

          Bemühe dich bitte, die Antworten auch zu *verstehen*.

          Habe ich doch verstanden. Daher ja die RewriteRule. Mein Problem ist aber, dass diese nicht funktioniert.

          1. Hi,

            Bemühe dich bitte, die Antworten auch zu *verstehen*.

            Habe ich doch verstanden. Daher ja die RewriteRule. Mein Problem ist aber, dass diese nicht funktioniert.

            Dann erkläre doch bitte, was die Regeln im einzelnen bewirken sollen.

            MfG ChrisB

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

        Wenn ich das jetzt durch absolute Verlinkungen umgehen möchte, gibt es eine angabe für das Hauptverzeichnis, damit ich nicht jedes mal http://www.name.de/css/main.css angeben muss, sondern sowas wie root/css/main.css reicht?

        selbstverständlich: /css/main.css

        Ciao,
         Martin

        --
        Wer schläft, sündigt nicht.
        Wer vorher sündigt, schläft besser.
  2. wieso funktioniert hier die dritte Zeile nicht?:

    RewriteRule ^de/$ /de [R]
    RewriteRule ^de$ /index.php
    RewriteRule ^de/(.+) /index.php?lang=de&path=$1

    erst geht. zweite geht. dritte gibt die index.php komplett ohne Formatierung und Bilder wieder.

    Wenn ich allerdings hinter die letzte Zeile [R] schreibe, sodass die neue URL auch im Browser angezeigt wird, dann funktionierts einwandfrei. Wieso? Eigentlich sollte die [R]-Flag doch nur die Anzeige beeinflussen, aber im Hintergrund hat die doch sonst keine Funktion?!
    Scheinbar klappen ohne die Flag aber auch die Eibindung von CSS und Pics, die sich in Unterverzeichnissen befinden, nicht mehr. Jemand ne Idee?

    ohne Redirect findet ein rein serverinternes URL Rewriting statt.
    Der Browser sieht im location bar http://example.org/de
    wenn deine index.php bilder/css/script-urls mit relativene Pfaden ausrüstet, dann wird der Browser immer nach de/your.css etc suchen. Das hast du wohl nicht intendiert.
    Nach einem redirect aber nach /your.css

    Das zweite problem ist dass

    RewriteRule ^de/(.+) /index.php?lang=de&path=$1

    auch auf de/your.css matcht.
    dadurch wird die index Datei aufgerufen, die natürlich keinen CSS Code ausliefert.
    Auch das hast du wohl nicht vorgesehen.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische