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.

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]
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.
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!
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!!!
Jeje. No te preocupes.
Me alegro de que te funcione.
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,
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
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
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
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,
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.