Moin,
der Code
Code: Alles auswählen
RewriteEngine On
RewriteRule ^/([^.]+)/$ $1.html?rw=1 [QSA,L]
RewriteCond %{QUERY_STRING} !^rw=1
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L]
ist schon richtig und nutzt einen bestimmten Trick, um bei so einer Konstellation eine Endlosschleife zu verhindern.
Das derzeitige Problem liegt daran, dass Dein Apache vermutlich so konfiguriert ist, dass er keinen symbolischen Links folgt. Daher der 404 bei /ordner/
Lösung:
Code: Alles auswählen
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^/([^.]+)/$ $1.html?rw=1 [QSA,L]
RewriteCond %{QUERY_STRING} !^rw=1
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L]
Und einmal zur Erläuterung Zeile für Zeile:
Einer RewriteRule wird gefolgt, auch wenn das Ziel keine reale Datei oder Ordner darstellt
mod_rewrite wird aktiviert.
Code: Alles auswählen
RewriteRule ^/([^.]+)/$ $1.html?rw=1 [QSA,L]
Beim Aufruf eines Ordners wird auf eine Datei umgeleitet, wobei Ordnernamen dem Dateinamen entspricht. Ein möglicher Query String wird angehängt (durch das Flag QSA), zugleich wird jedoch - als Trick - der Parameter rw=1 in den Query String eingefügt. Da dies ein interner Rewrite ist, ist sie vom Nutzer nicht sichtbar, für ihn bleibt /name/ in der URL bestehen, es wird lediglich der Inhalt aus name.html?rw=1 geholt und angezeigt.
Für die nächste RewriteRule wird zunächst überprüft, dass der Parameter rw=1 im Query String nicht gesetzt ist. Dies ist wichtig, da sonst die folgende Regel auch auf die eben zuvor umgeschriebene interne URL angewendet werden würde und damit zu einer Endlosschleife führen würde.
Code: Alles auswählen
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L]
Nun wird das Legacy Problem gelöst. Bisher waren die Dateien ja unter name.html publiziert. Aufrufe auf diese Dateien werden nun als externer Redirect per 301 moved permanently auf /name/ umgeleitet, so dass für den Nutzer (und Bots) die neue URL erscheint und somit zugleich interner DC vermieden sowie der alte Linkhjuice auf die neuen URLs geleitet wird.