2010-05-14 16 views
7

mod_rewrite verblüfft mich immer ... kann jemand mir die Regeln erklären, die ich benötige, um die folgenden sauberen URLs zu erhalten? Gewünschte URL links, echte URL rechts.Semantische URLs für statische HTML-Dateien mit .htaccess und mod_rewrite

/our-work/ => /our-work.html 
/our-work/some-project/ => /our-work/some-project.html 
/contact/ => /contact.html 

Wie Sie sehen können, möchte ich auch Schrägstriche für alle URLs erzwingen.

Danke!

Antwort

10

Versuchen Sie, diese Regel:

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^(.+)/$ $1.html [L] 

und Hinter für das Hinzufügen Schrägstriche:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301] 

Achten Sie darauf, diese Regeln zu setzen, die eine externe Umleitung verursachen (explizit mit R Flag oder implizit) in Vor den Regeln, die nur eine interne Umleitung/Neuschreiben verursachen. Also in diesem Fall:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^(.+)/$ $1.html [L] 
+0

Danke. Das funktioniert für die oberste Ebene/our-work/example, führt aber dazu, dass ich auf URLs wie /redirect:/our-work/some-project.html.html.html/ umgeleitet werde, wenn ich URLs mit zwei Ebenen wie/our treffe -work/irgendein-Projekt /. Ich sollte auch sagen, dass ich dies auf einer localhost URL im Moment mit den angegebenen Ports verwende. – alistairholt

+0

Gerade in einer anderen Umgebung getestet, war Crazy Redirect URL ein Problem von woanders, keine Ahnung wo. Ihre Lösung ist perfekt, danke! – alistairholt

+1

@ alistair.mp: Ah, du hast Recht. Ich habe eine Bedingung hinzugefügt, die testet, ob das Neuschreiben auf eine vorhandene Datei verweist, um eine unendliche Rekursion zu vermeiden. – Gumbo