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.

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í.

11 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,

  7. Comentario de Obiwan el 14 de diciembre de 2010 a las 01:02

    Uffff, veo que esto es antiguo, pero lo intentaré. Veamos yo tengo directorios y webs personales en donde como es lógico uso el intercambio de enlaces para SEO, pero claro, tengo una duda, como es lo correcto para un link…

    EJEMPLOS: Texto de Ejemplo con barra Texto de Ejemplo sin barra.

    Ya que es cosa curiosa en añadir a google una URL te la pide con barra al final, pero, en directorios estan sin barra al final… bueno algunos llevan barras y otros no… quizas sea una bobada y valen las 2 pero me corroe la curiosidad de como sería lo correcto.

    Gracias

  8. Comentario de Obiwan el 14 de diciembre de 2010 a las 01:05

    No ha salido lo de las barras, jejeje… me refiero a la barra del final del dominio, aqui lo he sustituido por el Link para que se viera, pero sería texto.

    http://www.loquesea.com/ con barra http://www.loquesea.com sin barra

  9. Comentario de jose el 28 de enero de 2011 a las 21:12

    Buenísimo el post David.
    Tenía esta url de ejemplo inmueble.php?$buscar=CasaConil&$id=114 y la quiero así inmueble-$1
    He probado esto
    RewriteRule ^inmueble-([0-9]+)?$ inmueble.php?id=$1 [L]
    RewriteRule ^inmueble-([0-9]+)([0-9]+)?$ inmueble.php?$buscar=$1&$id=$2 [L]
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /inmueble\.php\?id=([0-9]+)\ HTTP/
    RewriteRule ^inmueble\.php$ /inmueble-%1? [L,R=301]
    y he conseguido que me vaya a inmueble-$1 desde por ejemplo inmueble.php?id=114
    pero quiero redireccionar también la url original hacia inmueble-$1
    ¿Que me falta o qué hago mal?. Gracias

  10. Comentario de jose el 28 de enero de 2011 a las 21:22

    Por cierto, aunque ya se que la ayuda es desinteresada, al que me facilite la solución al problema que he planteado antes, le pongo un apartamento en la playa. Es coña, un partamento no pero si que le pongo un link desde 4 páginas diferentes (sin recíprocos) a la URL que me diga.
    Gracias de antemano,

  11. Comentario de Brocard Jr el 17 de agosto de 2011 a las 00:42

    Buenas tardes tengo una duda muy grande en nuestra pagina ya q el .htacces tiene muy buenas reglas para caracteres extraños y puedes hacer las urls amigables tambien.
    Mi url amigable yo la construyo de esta manera:
    RewriteRule ^([^/]+)_([^/]+)\.html$ index.php?data=$1_$2 [L]

    pero necestio quitarles las barras / a mi url sin q me haga daño en la busqueda.

Escribe un comentario

Entradas realcionadas

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