2010-05-14 14 views
7

mod_rewrite siempre me desconcierta ... ¿alguien me puede decir las reglas que necesito para obtener las siguientes URL limpias? URL deseada a la izquierda, URL real a la derecha.URL semánticas para archivos HTML estáticos con .htaccess y mod_rewrite

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

Como puede ver, quiero forzar el uso de barras diagonales en todas las URL.

Gracias!

Respuesta

10

Prueba esta regla:

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

Y para añadir una barra final:

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

Asegúrese de poner las reglas que causan una redirección externa (de forma explícita utilizando R bandera o implícitamente) en frente a esas reglas que solo causan una redirección/reescritura interna. Entonces en este caso:

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

Gracias. Eso funciona para el nivel superior/our-work/example pero termina redirigiéndome a URL como /redirect:/our-work/some-project.html.html.html/ cuando estoy llegando a URL con dos niveles como/our -work/some-project /. También debería decir que estoy usando esto en una URL de host local en este momento con los puertos especificados. – alistairholt

+0

Acabo de probar en otro entorno, la URL de redireccionamiento loco era un problema de otro lado, ni idea de dónde. Tu solución es perfecta gracias! – alistairholt

+1

@ alistair.mp: Ah, tienes razón. He agregado una condición que prueba si la reescritura apunta a un archivo existente para evitar una recursión infinita. – Gumbo

Cuestiones relacionadas