Flags bei Rewrite
bert
- sonstiges
0 Der Martin
1 Beat
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?
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
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.
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:
RewriteRule ^index.htm$ /de [R]
RewriteRule ^index.html$ /de [R]
RewriteRule ^de/$ /de [NC]
RewriteRule ^de$ /index.php [L,NC]
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]
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]
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
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
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.
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
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
wieso funktioniert hier die dritte Zeile nicht?:
RewriteRule ^de/$ /de [R]
RewriteRule ^de$ /index.php
RewriteRule ^de/(.+) /index.php?lang=de&path=$1erst 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