rewriteRule - lädt keine Bilder, ignoriert datei.css
Günter
- webserver
Guten Tag allerseits!
Eine Adresse der Form "http://www.xxx.org/verzeichnis/" soll nur dann die in "verzeichnis" liegende index.html laden, wenn "verzeichnis" existiert. Wenn nicht, dann Umleitung auf andere "http:...". Der Code in einer .htaccess (liegt dort: "http://www.xxx.org/.htaccess"):
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} -d
RewriteRule ^.*$ - [PT,L]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-d
RewriteRule ^verzeichnis.*$ http://.... [R=307,L]
funktioniert, allerdings wird die index.html dann ohne Formatierung und enthaltene Bilder gezeigt, was den Verdacht nahe legt, dass die relativen Pfadangaben in "index.html" nicht korrekt umgesetzt werden können - warum? Denn wenn ich von den 4 Zeilen die letzten beiden weglasse (den Fall des nicht vorhandenen Verzeichnisses), dann wird index.html korrekt angezeigt.
Danke für Hinweise
Günter
Hi,
Eine Adresse der Form "http://www.xxx.org/verzeichnis/" soll nur dann die in "verzeichnis" liegende index.html laden, wenn "verzeichnis" existiert. Wenn nicht, dann Umleitung auf andere "http:...".
Wozu soll das gut sein?
„Normal“ wäre die Ausgabe eines HTTP-Statuscodes 404 bei nicht vorhandenen Ressourcen (oder 410, je nachdem). Einfach wortlos woanders hin umzuleiten, ist idR. keine gute Idee.
[...] allerdings wird die index.html dann ohne Formatierung und enthaltene Bilder gezeigt, was den Verdacht nahe legt, dass die relativen Pfadangaben in "index.html" nicht korrekt umgesetzt werden können - warum?
Entweder, weil sie schlicht und einfach falsch sind in Bezug auf die vom Client angeforderte Adresse;
oder weil deine Umschreibung sie auch „erwischt“, und dann Adressen daraus macht, die nicht existieren.
MfG ChrisB
Hi,
. Einfach wortlos woanders hin umzuleiten, ist idR. keine gute Idee.
Ich will wortlos weiterleiten.
Entweder, weil sie schlicht und einfach falsch sind in Bezug auf die vom Client angeforderte Adresse;
oder weil deine Umschreibung sie auch „erwischt“, und dann Adressen daraus macht, die nicht existieren.
Die index.html wurde ja geladen - d.könnte nicht sein, wenn die Adresse nicht zur Clientanfrage passen würde - also sollten die relativen Pfadangaben in der index.html, die allesamt auf existierende Dateien weisen, doch auch gefunden werden
Günter
..oder werden die relativen Pfadangaben auch durch die rewrite-Engine gejagt-? Denn die angeforderten Dateien sind allesamt keine Verzeichnisse - wodurch sie an die zweite Bedingung (kein Verzeichnis auf dem Server) mit der http://.. weiterleitung gelangen..gibt es eine Möglichkeit, diese Pfade auszuschliessen?
Hi,
..oder werden die relativen Pfadangaben auch durch die rewrite-Engine gejagt-?
„Relative Pfadangaben“ interessieren den Server überhaupt nicht.
Den interessieren nur die Requests, die ihn erreichen - und die kommen mit absoluten Pfadangaben bei ihm am.
Denn die angeforderten Dateien sind allesamt keine Verzeichnisse - wodurch sie an die zweite Bedingung (kein Verzeichnis auf dem Server) mit der http://.. weiterleitung gelangen..gibt es eine Möglichkeit, diese Pfade auszuschliessen?
Das Flag zum Testen, ob etwas einem existierenden Verzeichnis entspricht, hat ein entsprechendes Gegenstück für Dateien.
MfG ChrisB
hi,
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} -d
RewriteRule ^.*$ - [PT,L]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-d
RewriteRule ^verzeichnis.*$ http://.... [R=307,L]
[..] wenn ich von den 4 Zeilen die letzten beiden weglasse (den Fall des nicht vorhandenen Verzeichnisses), dann wird index.html korrekt angezeigt.
Daraus schlussfolgere ich, dass die Regel in der 2. Zeile gar nicht matcht, weil, Du hast [L] angegeben, was heißt, dass beim Match keine weitere Regel angewandt werden soll, was jedoch bei Dir der Fall ist.
Hotti
Daraus schlussfolgere ich, dass die Regel in der 2. Zeile gar nicht matcht, weil, Du hast [L] angegeben, was heißt, dass beim Match keine weitere Regel angewandt werden soll, was jedoch bei Dir der Fall ist.
. wieso, es soll ja keine weitere Regel angewandt werden NACH der L-Flag (wenn Bedingung erfüllt, also ein Verzeichnis existiert, d.h. die index.html darin ja angezeigt wird .
Daraus schlussfolgere ich, dass die Regel in der 2. Zeile gar nicht matcht, weil, Du hast [L] angegeben, was heißt, dass beim Match keine weitere Regel angewandt werden soll, was jedoch bei Dir der Fall ist.
. wieso, es soll ja keine weitere Regel angewandt werden NACH der L-Flag (wenn Bedingung erfüllt, also ein Verzeichnis existiert, d.h. die index.html darin ja angezeigt wird .
Richtig, wenn Deine erste Regel mit L-flag matcht, soll keine weitere Regel angewandt werden. Deine erste Regel matcht aber nicht, so dass die zweite Regel greift.
Hotti
Hi,
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} -d
RewriteRule ^.*$ - [PT,L]
Wenn es sich um ein Verzeichnis handelt, wird also nicht umgeschrieben.
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-d
RewriteRule ^verzeichnis.*$ http://.... [R=307,L]
Wenn es sich nicht um ein Verzeichnis handelt (also z.B. um ein Bild oder eine CSS-Resource), die Request-Url aber mit verzeichnis beginnt, dann mach einen Redirect auf http://....
Da leider die entscheidende Information (wohin wird redirected) fehlt, kann man nicht wirklich sagen, was hier passiert.
Aber vermutlich leitest Du Bilder/CSS/... auf irgendetwas um, was weder Bild noch CSS ist.
Und dann wäre es nicht verwunderlich, wenn
die index.html dann ohne Formatierung und enthaltene Bilder gezeigt
wird.
cu,
Andreas
... den bisherigen Hinweisen zu diesem Thema zufolge möchte ich ergänzend zum obigen hinzufügen: dass, wenn die index.html geladen wurde der Fall:
angefragte RequestUri ist ein Verzeichnis auf dem Server, daher wird die Anfrage durchgelassen und bedient - sprich: das Verzeichnis wird aufgerufen und die in der Serverkonfiguration standardmäßig eingestellte "index.html" wird am Bildschirm des anfragenden Clients gezeig - - - leider nur ohne Formatierung der .css Datei, die im Header der "index.html" mit einer relativen Pfadangabe referenziert ist - usw.
Günter
Hallo,
... den bisherigen Hinweisen zu diesem Thema zufolge möchte ich ergänzend zum obigen hinzufügen: dass, wenn die index.html geladen wurde der Fall:
angefragte RequestUri ist ein Verzeichnis auf dem Server, daher wird die Anfrage durchgelassen und bedient - sprich: das Verzeichnis wird aufgerufen und die in der Serverkonfiguration standardmäßig eingestellte "index.html" wird am Bildschirm des anfragenden Clients gezeig - - - leider nur ohne Formatierung der .css Datei, die im Header der "index.html" mit einer relativen Pfadangabe referenziert ist - usw.
ja, und warum das so ist, hat MudGuard doch schon erklärt.
Nochmal ausführlicher.
1. Request: /verzeichnis/ (wir nehmen an, /verzeichnis sei *wirklich* ein Verzeichnis)
Hier trifft deine erste Rewrite Rule zu:
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} -d
RewriteRule ^.*$ - [PT,L]
Der Request wird also nicht umgeschrieben, sondern unverändert durchgereicht, das Default-Dokument aus /verzeichnis ausgeliefert.
2\. Request: /verzeichnis/style.css (eine beliebige eingebundene CSS-Ressource)
Die erste Rewrite Rule passt nicht, weil /verzeichnis/style.css kein Verzeichnis ist.
Die zweite passt aber, \*weil\* /verzeichnis/style.css kein Verzeichnis ist:
> ~~~apache
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-d
> RewriteRule ^verzeichnis.*$ http://.... [R=307,L]
Der Client wird also aufgefordert, sich die gesuchte Ressource woanders zu holen, wo sie vermutlich nicht existiert.
Nebenbei bemerkt ist es überflüssig, den Ausdruck %{DOCUMENT_ROOT}/
in der RewriteCond zu erwähnen, weil %{REQUEST_URI}
immer vom Document Root aus gilt.
So long,
Martin
... aha, dann werden die Links in der index.html auch durch die rewriteRule geprüft - das erklärt alles - Danke!
mfg
Günter