Hallo,
ich möchte Dateien mit der Endung .html anspeichern und möchte, dass sie auch ohne Dateiendung erreichbar sind. Zusätzlich soll immer auf die jeweilige URL ohne Dateiendung weitergeleitet werden. Mangels MultiViews habe ich es mit mod_rewrite versucht. /bla/blub.html soll also extern auf /bla/blub umgeleitet werden, was intern wieder auf /bla/blub.html umgesetzt wird. Ich dachte an folgendes:
RewriteEngine On
RewriteBase /
RewriteRule (.+).html$ /$1 [redirect=permanent,last]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+) $1.html [last,nosubreq]
Der last-Flag bei der ersten Regel wirkt, die Flags bei der zweiten habe ich nur testweise eingefügt, sie bringen beide nicht das Erhoffte.
Wenn ich localhost/bla/test.html aufrufe, zeigt das Rewrite-Log:
[per-dir c:/projekte/] strip per-dir prefix: c:/projekte/bla/test.html -> bla/test.html
[per-dir c:/projekte/] applying pattern '(.+).html$' to uri 'bla/test.html'
[per-dir c:/projekte/] rewrite bla/test.html -> /bla/test
[per-dir c:/projekte/] explicitly forcing redirect with http://localhost/bla/test
[per-dir c:/projekte/] escaping http://localhost/bla/test for redirect
[per-dir c:/projekte/] redirect to http://localhost/bla/test [REDIRECT/301]
Das ist wie beabsichtigt. Wenn der Browser dem Redirect folgt, kommt:
initial (...) [per-dir c:/projekte/] strip per-dir prefix: c:/projekte/bla/test -> bla/test
initial (...) [per-dir c:/projekte/] applying pattern '(.+).html$' to uri 'bla/test'
initial (...) [per-dir c:/projekte/] strip per-dir prefix: c:/projekte/bla/test -> bla/test
initial (...) [per-dir c:/projekte/] applying pattern '^(.+)' to uri 'bla/test'
initial (...) RewriteCond: input='c:/projekte/bla/test' pattern='!-f' => matched
initial (...) RewriteCond: input='c:/projekte/bla/test.html' pattern='-f' => matched
initial (...) [per-dir c:/projekte/] rewrite bla/test -> bla/test.html
initial (...) [per-dir c:/projekte/] add per-dir prefix: bla/test.html -> c:/projekte/bla/test.html
Bis hier ist alles wie beabsichtigt. /bla/test wird intern zu /bla/test.html umgeschrieben, weil keine Datei /bla/test existiert. Danach kommt allerdings ein »internal redirect«, den ich mir nicht erklären kann:
initial (...) [per-dir c:/projekte/] strip document_root prefix: c:/projekte/bla/test.html -> /bla/test.html
initial (...) [per-dir c:/projekte/] internal redirect with /bla/test.html [INTERNAL REDIRECT]
initial/redir#1 (...) [per-dir c:/projekte/] strip per-dir prefix: c:/projekte/bla/test.html -> bla/test.html
initial/redir#1 (...) [per-dir c:/projekte/] applying pattern '(.+).html$' to uri 'bla/test.html'
initial/redir#1 (...) [per-dir c:/projekte/] rewrite bla/test.html -> /bla/test
Hier wendet er wieder Regel eins auf den umgeschriebenen Pfad an und schneidet .html wieder ab.
initial/redir#1 (...) [per-dir c:/projekte/] explicitly forcing redirect with http://localhost/bla/test
initial/redir#1 (...) [per-dir c:/projekte/] escaping http://localhost/bla/test for redirect
initial/redir#1 (...) [per-dir c:/projekte/] redirect to http://localhost/bla/test [REDIRECT/301]
Somit leitet /bla/test letztlich wieder auf /bla/test weiter und der Browser wird endlos weitergeleitet. Wie kann das verhindert werden?
Mathias