Hi,
In meinem Verzeichnis d:/HTML/test befinden sich 2 Dateien:
foo.htm
index.htm
Ich hätte jetzt gerne folgende Dateien ausgeliefert:
Request: Auslieferung:
/test/index.htm index.htm (index.htm existiert ==> benutzen)
/test/index.html index.htm (.html --> .htm, index.htm existiert ==> benutzen)
/test/foo.htm foo.htm (foo.htm existiert ==> benutzen)
/test/foo.html foo.htm (.html --> .htm, foo.htm existiert ==> benutzen)
/test/bar.htm index.htm (bar.htm existiert nicht ==> index.htm)
/test/bar.html index.htm (.html --> .htm, bar.htm existiert nicht ==> index.htm)
/test/baz.htm index.htm (baz.htm existiert nicht ==> index.htm)
/test/baz.html index.htm (.html --> .htm, baz.htm existiert nicht ==> index.htm)
Mit anderen Worten: die Endung .html auf .htm umschreiben, danach, falls die Datei existiert, diese ausliefern, ansonsten die index.htm ausliefern.
(zwischen den Schritten .html --> .htm und nichtexistierend --> index.htm sollen noch weitere Schritte folgen, in denen noch der Pfad geändert werden könnte)
DocumentRoot ist d:/HTML
Folgendes steht in meiner rewrite.conf
RewriteEngine On
RewriteLog "logs/rewrite.log"
RewriteLogLevel 9
.html ---> .htm (for historical reasons)
RewriteRule /test/(.*).html /test/$1.htm
if file does not exist --> index.htm
RewriteCond %{REQUEST_URI} (/test/[^/]+/[^/]+/.*)
RewriteCond %{DOCUMENT_ROOT}%1 !-f
RewriteRule /test/([^/]+)/([^/]+)/(.*) /test/$1/$2/index.htm
Im Rewritelog steht für den Aufruf von http://localhost/test/foo.html folgendes (die Spalten mit IP, Zeit usw. hab ich weggetan, die sind uninteressant, dafür hab ich Zeilennummern davorgesetzt):
1: (2) init rewrite engine with requested uri /test/foo.html
2: (3) applying pattern '/test/(.*).html' to uri '/test/foo.html'
3: (2) rewrite /test/foo.html -> /test/foo.htm
4: (3) applying pattern '/test/([^/]+)/([^/]+)/(.*)' to uri '/test/foo.htm'
5: (4) RewriteCond: input='/test/foo.html' pattern='(/test/[^/]+/[^/]+/.*)' => matched
6: (4) RewriteCond: input='D:/HTML/test/foo.html' pattern='!-f' => matched
7: (2) rewrite /test/foo.htm -> /test/index.htm
8: (2) local path result: /test/index.htm
9: (2) prefixed with document_root to D:/HTML/test/index.htm
10: (1) go-ahead with D:/HTML/test/index.htm [OK]
Angezeigt wird also die index.htm, nicht die foo.htm
Zeile 1 zeigt den ursprünglichen Request.
Zeile 2 und 3 zeigen, daß das Entfernen des l vom .html klappt.
Zeile 4 zeigt, daß jetzt versucht wird, die Regel für index.htm anzuwenden, hier mit der korrekten Endung .htm
Zeile 5 zeigt, daß die erste Bedingung geprüft wird, allerdings mit der Original-URI, nicht mit der aktuellen.
Damit ist auch das %1 in der zweiten Bedingung falsch belegt, es wird nach foo.html gesucht, welches natürlich nicht gefunden wird.
Damit wird auf index.htm umgeschrieben.
Wenn ich das richtig sehe, brauche ich also in der ersten Bedingung statt %{REQUEST_URI} eher %{REQUEST_URI_AFTER_PREVIOUS_REWRITES_ARE_APPLIED}.
Dazu finde ich in der Doku aber leider nichts.
Auch der Versuch, der ersten Rule ein [N] zu verpassen, hat nichts wesentliches geändert:
1: (2) init rewrite engine with requested uri /test/foo.html
2: (3) applying pattern '/test/(.*).html' to uri '/test/foo.html'
3: (2) rewrite /test/foo.html -> /test/foo.htm
3a: (3) applying pattern '/test/(.*).html' to uri '/test/foo.htm'
4: (3) applying pattern '/test/([^/]+)/([^/]+)/(.*)' to uri '/test/foo.htm'
5: (4) RewriteCond: input='/test/foo.html' pattern='(/test/[^/]+/[^/]+/.*)' => matched
6: (4) RewriteCond: input='D:/HTML/test/foo.html' pattern='!-f' => matched
7: (2) rewrite /test/foo.htm -> /test/index.htm
8: (2) local path result: /test/index.htm
9: (2) prefixed with document_root to D:/HTML/test/index.htm
10: (1) go-ahead with D:/HTML/test/index.htm [OK]
Es ist nur die Zeile 3a dazugekommen.
[R] darf ich nicht benutzen, der Client soll nichts von der Umschreiberei mitbekommen.
cu,
Andreas
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter
O o ostern ...
Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.