Como quitar la barra final de las URLs con htaccess y mod_rewrite

Este código para el .htaccess convierte las URLs dinámicas en URLs estáticas sin extensión y elimina la barra final.

# Redirigir las URLs dinámicas a las amigables (y sin la barra al final).
RewriteRule ^index.php?id=([0-9]+)$ /$1? [R=301,L]

# Si alguien intenta ponerle una barra, quitarla.
RewriteRule ^([0-9]+)/$ /$1? [R=301,L]

# Cuando se solicita una URL que coincida con los parámetros de nuestra variable "id" (y sin ninguna barra al final), mostrar el contenido del fichero.
RewriteCond %{REQUEST_URI} ^/([0-9]+)$
RewriteRule ^([0-9]+)$ /index.php?id=%1 [L]

Si solicitamos www.posicionapro.com/index.php?id=21, Apache nos enviará mediante una redirección permanente a la URL www.posicionapro.com/21 (sin barra final).

Si intentamos ponerle a nuestra URL amigable una barra final www.posicionapro.com/21/, Apache nos enviará mediante una redirección permanente a la URL www.posicionapro.com/21 (sin barra final).

Por último, si la URL solicitada coincide con nuestros criterios (un número sin ninguna barra ni nada), Apache nos muestra el contenido del fichero index.php utilizando los datos que corresponden a la id 21.

Otra manera más sencilla de conseguir el mismo resultado:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} ^/(.+).php HTTP/
RewriteRule ^(.+).php$ /$1 [R=301,L]

Si la URI solicitada tiene una barra al final y si no es un directorio de verdad, redirigir a la misma URI pero sin la barra. Si se solicita el fichero loquesea.php, se redirecciona a /loquesea.

Compartir este artículo:
  • del.icio.us
  • Google Bookmarks
  • Meneame
  • Technorati
  • BlogMemes Sp
DavidM
Acerca de DavidM
DavidM lleva trabajando en los campos del marketing por Internet y el posicionamiento en buscadores desde el año 2004. Puede ver su biografía aquí.

6 comentarios para el post “Como quitar la barra final de las URLs con htaccess y mod_rewrite”

  1. Comentario de Dani el 27 de Noviembre de 2009 a las 03:12

    Hola David,
    he provado millon de cosas, esto que explicas tb pero no lo consigo.
    Resulta que puse hace unos meses y gracias a vuestra ayuda desde aquí, la barrita final siempre en las url pero ahora me gustaria hacerlo solo a las carpetas de primer nivel, tipo: miweb.com/seccion/

    y al resto de paginas, las que estan en un 3er nivel de directorio tipo: miweb.com/seccion/pagina dejarlas sin la barrita final.

    Con el htacces que tengo ahora no lo consigo. ¿Podrias ayudarme, por favor? .. gracias!!

    # URL CANONICA WWW

    RewriteRule ^index\.(php|html|htm)$ http://www.miweb.com/ [R=301,L]
    RewriteCond %{HTTP_HOST} ^miweb\.com [NC]
    RewriteRule ^(.*)$ http://www.miweb.com/$1 [R=301,L]

    # AÑADIR LA BARRA FINAL SIEMPRE

    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(.*)/$
    RewriteRule ^(.*)$ http://www.miweb.com/$1/ [R=301,L]

    # SI HAY MAS DE UNA BARRA PONER SOLO UNA

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)/{2,}\ HTTP/
    RewriteRule ^(.*)$ /%1/? [R=301,L]

    # FRIENDLY URL MODULOS

    RewriteRule ^([^/\.]+)/$ ?mod=$1 [L]

    # Ocultar extension paginas
    RewriteRule ^seccion/([^/\.]+)/$ /seccion/$1.php [L]

    # REDIRECCION 301 URL DINAMICA ?mod=$1 A URL ESTATICA

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\?mod=(.+)\ HTTP/
    RewriteRule ^$ /%1/? [L,R=301]

  2. Comentario de DavidM el 28 de Noviembre de 2009 a las 00:31

    Quita el código que tienes para añadir la barra final siempre y utiliza algo como esto:

    # la barra final solo a las carpetas de primer nivel.
    RewriteCond %{REQUEST_FILENAME} !-f [NC]
    RewriteCond %{REQUEST_FILENAME} !-d [NC]
    RewriteRule ^([^/]+)/$ /?mod=$1 [L]

    # si la carpeta es de primer nivel y no tiene la barra final, añadirla.
    RewriteCond %{REQUEST_FILENAME} !-f [NC]
    RewriteRule ^([^/]+)$ /$1/ [R=301,L]

    # Si la carpeta no es de primer nivel y tiene una barra final, quitarla.
    RewriteRule ^([^/]+)/(.+)/$ /$1/$2 [R=301,L]

    # Reescribir las carpetas de segunda nivel.
    RewriteCond %{REQUEST_FILENAME} !-f [NC]
    RewriteRule ^([^/]+)/([^/]+)$ /?mod=$1&mod2=$2 [L]

    Espero que te sea útil este ejemplo.

  3. Comentario de Dani el 28 de Noviembre de 2009 a las 15:27

    Funciona perfecto!!!! muuuchas gracias!!
    Solo una última cosa que me falta para rematar el tema..

    Veo que si añado una o mas barras a las carpetas de 1er nivel no las elimina,
    en cambio las de 3er nivel si las quita todas si añades barras, como yo quiero..

    tu que dominas, una ultima ayudita para que siempre sea solo una barrita en el primer nivel.. por favor?
    un saludote!

  4. Comentario de Dani el 28 de Noviembre de 2009 a las 15:35

    por dios! olvida lo último que te he preguntado, pues ya lo tenia, y lo habia eliminado…
    Era esto:

    # SI HAY MAS DE UNA BARRA PONER SOLO UNA

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)/{2,}\ HTTP/
    RewriteRule ^(.*)$ /%1/? [R=301,L]

    GRACIAS!!!

  5. Comentario de DavidM el 28 de Noviembre de 2009 a las 16:41

    Jeje. No te preocupes. ;)

    Me alegro de que te funcione.

  6. Comentario de Dani el 28 de Noviembre de 2009 a las 20:57

    He estado actualizando las url’s y tal y me he encontrado con el problema de que tengo algunas carpetas de 2º nivel que contienen un index a las que lincaba directamente a la carpeta con la barra y ahora no se como arreglarlo, porque da error..

    Supongo que lo mas lógico seria tener siempre lo mismo y no las de 1er nivel si i las de 2º no.. ¿que opinas?

    Estaba pensando si habria alguna forma de especificar que solo trate así a una carpeta especifica, es decir, algo así:

    miweb . com/seccion/pagina

    Que solo afecte a las paginas que van despues de seccion,
    o al revés, que solo tengan barra los de 1er nivel que yo le diga, y el resto normal, todos sin barra (supongo que esto seria lo mas logico, y con lo que evitaria futuros problemas..)

    Quizás esto ultimo ya seria haciendo un 301 normal de cada pagina, o que?

    Espero no estar ya agobiando.. lo siento!

    gracias!!

    Saludos,

Escribe un comentario

Entradas realcionadas

  1. Redireccionar URLs eliminando los parámetros con mod_rewrite
  2. Urls amigables con mod_rewrite
  3. Canonicalizacion
  4. Redireccionar URL dinámica a URL estática
  5. Quitar Smart Quotes de Wordpress