Urls amigables con mod_rewrite

Si te gusta lo que ves y te parece interesante, suscribete por email o por RSS. ¡Gracias por tu visita!.

¿No sabes qué es una url amigable? ¿Sabes lo qué es, pero no sabes cómo convertir tus urls en amigables? En este artículo explicaremos qué son, para qué sirven y cómo gestionarlas.

Las urls amigables son urls dinámicas que las arañas y los usuarios ven como estáticas. ¿Pero esto qué quiere decir exactamente? Con un ejemplo se entiende mucho mejor. Imaginemos que tenemos una catálogo online de productos de cosmética y nuestros productos se distinguen por un código.

  • Crema hidratante: código 6587
  • Crema protección solar: código 9875
  • Pintalabios: código 8547

Normalmente los productos se almacenarán en una base de datos y cada producto se diferenciará de los demás por su código (identificador). En esta base de datos se almacenaran también las características de los productos como por ejemplo el precio, tipo de producto, tipo de piel, etc. Para mostrar los productos en la web, los programadores crearán una sola página para mostrar todos los productos, por ejemplo: ficha.php y dependiendo del código enviado como variable se mostrará un producto u otro. Es decir las urls tendrán el siguiente aspecto:

ficha.php?codigo=6587 -> en este caso se ha enviado la variable código 6587 y en la página ficha se mostrarán las características del producto crema hidratente.

ficha.php?codigo=9875 -> en este caso se ha enviado la variable código 9875 y en la página ficha se mostrarán las características del producto crema protección solar.

Aquí es cuando viene un seo y dice que esta url no le dice nada ni a las arañas de los buscadores ni al usuario que visita nuestra web ya que para nosotros el código 9875 nos deja totalmente indiferentes. Y además esto no es un enlace intuitivo ni fácil de recordar. ¿Entonces hay que reprogramar toda la web para que las urls contengan las palabras clave para cada producto? ¿o debemos crear una página estática para cada producto? Evidentemente no. Aquí es donde entra el famoso mod-rewrite. Mod_rewrite es una directiva unix de Apache que te permite reescribir la url y convertir urls del tipo pagina.php?variable=$var en nombre/producto.html por ejemplo. Más adelante veremos que a la hora de reescribir la url existen muchas posibilidades. Pero antes vamos a parar un momento, hemos visto Apache y .php… mmmmh. Está claro que esto sólo se puede hacer con servidores apache, así que si tienes la posibilidad de elegir el tipo de servidor es mejor que elijas un servidor Apache.

Bien, ahora que hemos entendido qué hay que hacer la pregunta es cómo. Muy sencillo editando el fichero .htaccess. .htaccess es un archivo de texto oculto que puede encontrarse en cada uno de los directorios públicos de los servidores web. Estos archivos contienen una serie de directivas para el servidor Apache que se aplicaran en el directorio donde se encuentra el fichero y en sus subdirectorios también, es decir cuando al servidor le llega una petición de una url, el servidor irá a buscar si en el fichero .htaccess existe alguna directiva para dicha página y si la encuentra la aplicará. Estas directivas las escribes tu mismo editando este fichero. Aquí es donde encontramos el segundo inconveniente, hay algunos proveedores de alojamiento web que no permiten editar los ficheros .htaccess libremente y que limitan las directivas que puedas añadir, así que si está en tu mano escoger el servidor no dudes en informarte sobre el acceso a estos ficheros ya que no sólo te servirán para las urls amigables sino que tienen múltiples utilidades muy interesantes.

Veamos un caso muy simple de una directiva en .htaccess, imagina que has movido una página de un directorio a otro y no quieres que cuando una persona vaya al directorio antiguo le salga un error 404 Page not found. Una posibilidad es redirigir a esa persona al nuevo directorio, esto es tan simple como escribir esto en el fichero .htaccess:

Redirect 301 /directorio-viejo/pagina.html http://www.tu-dominio.com/directorio-nuevo/pagina.html

¡Además le estas indicando a las arañas que esta página ha sido movida de manera permanente con el código 301! Podríamos extendernos en este ejemplo ya que es muy interesante y vemos múltiples utilidades, pero nos adentraremos directamente al tema en cuestión, la sintaxis de la directiva mod_rewrite:

<IfModule mod_rewrite.c> //indica el inicio de la directiva mod_rewrite
RewriteEngine On
//se activa la reescritura
RewriteRule url-solicitada url-destino [bandera] //se define la regla
</IfModule> //indica el fin de la directiva mod_rewrite

La dificultad aquí está en cómo se define la regla, para ello se usan las expresiones regulares y es quizás el punto más difícil de todo esto. A continuación la definición de Wikipedia de expresión regular:

Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón “H(a|ä|ae)ndel”.”

Puedes encontrar diversos manuales/tutoriales y explicaciones sobre expresiones regulares por Internet. Nosotros te presentamos algunos de ellos:

Veamos un ejemplo, volvamos al caso del catálogo de productos de cosmética. Pongamos que deseamos que las urls que de la ficha de los productos tengan el siguiente aspecto:

nombre-del-producto-c-codigo.html

Es decir, el nombre del producto separado por guiones, un guión, la letra c, un guión, el código, un punto y “html”. Cuando se enlace al producto la url deberá construirse de la siguiente manera:

<? echo “<a href=”" . str_replace(” “,”-”,”Nombre del producto”) . “-c”- . $codigo-producto . “.html>Nombre del producto</a>”; ?>

Y entonces en el fichero .htaccess se indicará que este tipo de url se traducen como:

ficha.php?codigo=codigo

¿Y cómo se hace? pues así:

RewriteRule ^(.*)-c-([0-9]+).html$ ficha.php?codigo=$2

Le estas indicando que las urls que tengan el formato cualquier cosa “(.*)” posteriormente “-c-” y posteriormente un número con x dígitos ([0-9]+), sea traducida como ficha.php?codigo= y posteriormente la variable $2 que viene a referirse a la parte del patrón de un número con x dígitos ([0-9]+). Es importante incluir al final el signo del dolar $, para que se entienda que es el final de la cadena y no se devuelva la página en caso de que se introduzcan más carácteres al final de la URL.

Puedes profundizar más sobre la directiva mod_rewrite en la página oficial de apache.

Compartir este artículo:
  • del.icio.us
  • Google Bookmarks
  • Meneame
  • Technorati
  • BlogMemes Sp
sara bosch
Acerca de sara bosch
Sara Bosch está trabajando en PosicionaPro desde el 2008. Puede ver el resto de su biografía aquí. Muchas de las cosas que ha ido aprendiendo y descubriendo sobre posicionamiento web y marketing por Internet en general las ha ido compartiendo en este blog.

46 comentarios para el post “Urls amigables con mod_rewrite”

  1. Comentario de www.seoclon.com el 1 de Julio de 2008 a las 12:48

    Urls amigables con mod_rewrite…

    Artículo sobre qué son las urls amigables, sus ventajas y cómo gestionarlas….

  2. Comentario de DavidM el 1 de Julio de 2008 a las 16:16

    Excelente artículo. Utilizar URLs amigables afecta el posicionamiento, la usabilidad y otras variables del marketing en internet. ¿Te animas a hacer un experimento para comprobar que las URLs estáticas se posicionan mejor que las dinámicas?

  3. Comentario de viktorvaik el 1 de Octubre de 2008 a las 09:07

    Me gustaria que me ayudarais a crear unas lineas para mi htaccess de una pagina que tengo con el script de meneame y no puedo poner las url amigables. Gracias

  4. Comentario de sara el 1 de Octubre de 2008 a las 10:21

    ¡Hola viktorvaik! ¿Qué problema tienes exactamente? Mándanos las urls que quieres reescribir para poderte ayudar.

  5. Comentario de viktorvaik el 1 de Octubre de 2008 a las 10:29

    Pues mira, son las stories de http://recetas-decocina.es/ en las cuales si te metes en una noticia(receta) clicando en meneos me aparece la url con parametros, por ejemplo la primera: http://recetas-decocina.es/story.php?id=76 y me gustaria que saliese con url amigable, por ejemplo: http://recetas-decocina.es/story/tarta-de-ricota-al-limon. Espero que me podais hechar una mano que me estoy volviendo loco buscando por la red y no encuentro nada…Gracias de antemano

  6. Comentario de sara el 1 de Octubre de 2008 a las 15:48

    Una manera muy fácil que tienes de conseguir esto es siguiendo exactamente el ejemplo del artículo. Sin embargo deberás incluir la id dentro de la URL, es la forma más eficaz ;)

    En tu caso los enlaces internos debes colocar el siguiente código en PHP:

    <?php echo "<a href=\"http://recetas-decocina.es/story" . $id . "/" . str_replace(" ","-","Nombre de la receta") . ".html rel="nofollow">Nombre de la receta</a>"; ?>

    Con lo cual la URL de la receta de la tarta de ricota al limón sería:
    http://recetas-decocina.es/story76/tarta-de-ricota-al-limon.html

    Dentro del fichero .htaccess deberás poner la siguiente directiva:
    RewriteRule ^(.*)/story([0-9]+)/(.*)\.html$ story.php?id=$2

  7. Comentario de sara el 1 de Octubre de 2008 a las 16:11

    DavidM, creo que el artículo Estudio sobre la densidad y la relevancia de las palabras clave y la importancia de las zonas clave en el algoritmo de Google demuestra bastante que el hecho de tener una URL amigable supone una ventaja interesante para el posicionamiento de una página, ¿no crees? :)

  8. Comentario de viktorvaik el 1 de Octubre de 2008 a las 16:15

    Gracias Sara, pero no puedo tocar los enlaces internos ya que es un script y los genera, entonces no puedo meter el codigo php dentro de ningun sitio salvo en index,story…y no tengo ningun archivo de cada articulo…

  9. Comentario de DavidM el 1 de Octubre de 2008 a las 17:34

    Hola Victor.

    El código que te ha dado Sara es el código que necesitas. Reemplaza “Nombre de la receta” con la variable que contiene los títulos de los artículos.

  10. Comentario de URLs amigables el 18 de Noviembre de 2008 a las 02:24

    [...] URLs amigables con mod_rewrite [...]

  11. Comentario de tata009 el 19 de Enero de 2009 a las 01:44

    Hola amigos excelente articulo , che , yo quiero tener direcciones asi:

    http://www.microftonic.com/posts/categoria/id/nombre-articulo.html

    me ayudaria con el codigo en el .htaccess y en los enlaces ??

    saludos un abrazo

  12. Comentario de bosch el 2 de Febrero de 2009 a las 10:11

    Hola tata009,

    No puedo saber exactamente cómo tendría que ser el código porque no sé cómo tienes las urls actuales. Pero con el ejemplo que ponemos en este artículo seguro que podrás deducir tu “Rewrite Rule”, ¿no sería algo como…?

    RewriteRule ^(.*)/posts/(.*)/([0-9]+)/(.*).html$ articulo.php?categoria=$2&id=$3

    Ya te digo que me lo he inventado porqué no sé como son las urls actuales. :P

    Tal y como describes parece que lo has hecho con WordPress. ¿Lo has hecho con WordPress? Si es así puedes ir a tu panel de administrador >> Opciones >> Permanent Link y allí te lo ponen muy fácil… ;)

    Un saludo.

  13. Comentario de bosch el 6 de Febrero de 2009 a las 10:50

    Aquí va un enlace muy interesante relacionado con el comentario anterior.

    http://codex.wordpress.org/Using_Permalinks

  14. Comentario de Dani el 19 de Mayo de 2009 a las 02:58

    Hola,
    he aplicado el ejemplo pero tengo un problema que no consigo solucionar.

    Al redirigir el index.php con la 1a regla:
    RewriteRule ^index\.(php|html|htm)$ http://www.ejemplo.com/ [R=301,L]

    se me escacharran las url amigables de las secciones que cargan en el propio index:
    RewriteRule ^([^/\.]+)/?$ /index.php?section=$1 [L]

    dejan de funcionar de modo que la url final queda así de mal http://www.ejemplo.com/?section=titulo

    ¿como puedo solucionar este tema?

    muchas gracias,

    un saludo

  15. Comentario de sara bosch el 20 de Mayo de 2009 a las 11:45

    Hola Dani, es raro lo que te pasa.

    ¿Has incluido lo de RewirteCond? ¿Por qué no pruebas esto?

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteRule ^index\.php$ http://www.ejemplo.com/ [R=301,L]

    A mi me ha funcionado.

    Bueno en este caso sólo tiene en cuenta .php, luego tendrías que incluir lo de htm y html

    Dime si te ha funcionado. ;)

    Un saludo.

  16. Comentario de Dani el 20 de Mayo de 2009 a las 21:03

    Porque no se publica el comentario?

  17. Comentario de Dani el 20 de Mayo de 2009 a las 21:32

    Gracias por la respuesta, se agradece!
    Pero al final lo solucioné siguiendo un tuto con un script en PHP.

  18. Comentario de Dani el 20 de Mayo de 2009 a las 21:36

    He probado tu script y funciona correctamente, lo que pasa que tambien necesitaba redirigir las veriones con y sin ww. La cosa es que yo quería canonicalizar las URL con y sin ww + lo del tema de redirigir index.php al dominio canónico, pero con este script que encontré de PHP ya ha quedado solucionado perfectamente. El problema con el que me encuentro ahora es que veo que se puede acceder a los modulos igualmente si se escriben así: index.php?section=titulo Claro que la gente solo podria entrar en caso de conocer como esta programado. Pero mi pregunta es ¿esto es normal o deberia solucionarlo?

  19. Comentario de Dani el 20 de Mayo de 2009 a las 21:36

    Y ya para rematar y dejarlo todo niquelado me gustaria solucionar lo siguiente:
    He maquetado la web modularmente siguiendo el tuto de Zona, así que soy novato es esto de los modulos..
    Tengo una carpeta que contiene una serie de paginas php estáticas. (no modulares, de momento) y para que las url no desentonen respecto a las secciones que no llevan la extension final (.php) he renombrado los links /así/.
    Funciona, el problema es que se sigue pudiendo acceder a cada pagina si se escribe la extensión final del archivo. Así que tengo esas paginas duplicadas.

    En el htacces, he hecho esto:

    RewriteRule ^carpeta/([^/\.]+)/?$ /carpeta/$1.php [L]

    He estado probando también a modularizar las paginas que contiene esta carpeta pero aun así, utilizando la regla:

    RewriteRule ^carpeta/([^/\.]+)/?$ /index.php?section=$1 [L]

    en .htaccess se sigue pudiendo acceder a la misma pagina de 2 formas; con el /carpeta/ delante de la pagina en cuestión y con solo el /nombre-de-la-pagina/

    ¿Como deberia hacer para que la url mostrada fuera unicamente: http://www.ejemplo.com/carpeta/nombre-de-la-pagina/?

    …….
    gracias y saludos!

  20. Comentario de Dani el 20 de Mayo de 2009 a las 21:52

    ¿Como deberia hacer para que la url mostrada fuera unicamente: http://www.ejemplo.com/carpeta/nombre-de-la-pagina/ ? y que no se podiera acceder de ninguna otra forma, claro

    Perdon por tanto comment, pero no se que pasaba con el texto que no le gustaba y no se publicaba..
    sorry

  21. Comentario de Dani el 21 de Mayo de 2009 a las 00:32

    .. Hola de nuevo,
    ahora me doy cuenta de que si se añaden barras slash /// al final de las url no se redirecciona la pagina eliminado las sobrantes y dejando solo una.

    Vaya lio.. estoy por pasarme a wordpress.. ; )

    para aclarar las cosas os pego mi .htaccess con todo lo que tengo:

    ¿hay que hacer algo esecial para poder publicar codigo en eeste blog?

  22. Comentario de Dani el 21 de Mayo de 2009 a las 00:35

    en el PHP tengo esto:

    if (preg_match(’#(.*)index\.(html|php)$#’, $_SERVER['REQUEST_URI'], $captures)) {
    // 301 redirection
    header(’HTTP/1.1 301 Moved Permanently’);
    header(’Location: ‘ . $captures[1]);

    Realmente me gustaria tenerlo todo unificado en el .htaccess

  23. Comentario de Dani el 21 de Mayo de 2009 a las 01:16

    #REDIRECCION CANONICA

    Options +Indexes
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{HTTP _HOST} ^ejemplo\. com [NC]
    RewriteRule ^(.*)$ http: //www. ejemplo. com/$1 [R=301,L]

    #AÑADIR LA BARRITA FINAL SIEMPRE

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

    #REDIRECCIONAR MODULOS

    RewriteEngine on
    RewriteRule ^([^/\.]+)/?$ /index.php? mod=$1 [L]
    RewriteRule ^carpeta/([^/\.]+)/?$ /carpeta/$1.php [L]

    #PRUEBA CARPETA

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

  24. Comentario de DavidM el 25 de Mayo de 2009 a las 10:06

    Para redireccionar las URL dinámicas a las URL estáticas:

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?section=([a-zA-Z0-9]+)\ HTTP/
    RewriteRule ^index\.php$ http://www.ejemplo.com/section-%1/? [R=301,L]

  25. Comentario de sara bosch el 25 de Mayo de 2009 a las 10:14

    Hola Dani,

    El problema con el que me encuentro ahora es que veo que se puede acceder a los modulos igualmente si se escriben así: index.php?section=titulo Claro que la gente solo podria entrar en caso de conocer como esta programado. Pero mi pregunta es ¿esto es normal o deberia solucionarlo?

    Por lo que he entendido creo que esto se soluciona simplemente diciendo que es una redirección 301. Es decir, diciendo no sólo como es el nuevo URL, sino diciendo que este URL ha cambiado. La gracia de esto es que sólo exista una URL por página, pero que si te enlazan al URL verdadero no pierdas el enlace entrante y su “fuerza” vaya a parar al URL amigambe. Esto se consigue con el 301.
    Así que si alguien accede a tu URL verdadero verá que se redirige al URL amigable, pero no pasa nada. ;) Es que sino ¿qué quieres? ¿Que te dé un error 404? No, mejor que cuando entres al URL verdadero te haga un 301 y te reescriba el URL y punto.
    Los enlaces dentro de tu web los pones amigables también. Pero esto supongo que ya lo habrás hecho. ;)

    href=”URLamigable”

  26. Comentario de Dani el 25 de Mayo de 2009 a las 13:16

    Hola, he probado lo que decias DavidM, pero no me funciona. ;(
    En cuanto a lo del 301 que me comentas, Sara, eso suponía yo, que habia que redireccionarlo permanentemente, pero es que cuando coloco la [R=301] al final de RewriteRule entonces lo hace al revés, me redirige a la pagina reescribiendo la url así: index.php?section=titulo. Los enlaces ya estan correctamente escritos así: http://www.ejemplo.com/modulo/

    #REDIRECCIONAR MODULOS

    RewriteEngine on
    RewriteRule ^([^/\.]+)/?$ /index.php?mod=$1 [L]
    RewriteRule ^carpeta/([^/\.]+)/?$ /carpeta/$1.php [L]

  27. Comentario de max el 29 de Mayo de 2009 a las 08:04

    Hola, estoy haciendo una pagina web y me piden que en una pagina que al hacer click en su hipervinculo aparece
    http://www.pagina.com/secciones/productos/automovil/automovil.php?idioma=es
    aparezca
    http://www.pagina.com
    Estuve leyendo el articulo pero no logro entender la manera de hacerlo. Hay que modificar tambien el hipervinculo?
    Muchas gracias

  28. Comentario de max el 29 de Mayo de 2009 a las 08:05

    perdon quise poner en el resultado final que me tiene que quedar
    http://www.pagina.com/automoviles

  29. Comentario de DavidM el 29 de Mayo de 2009 a las 12:50

    max, si es solo esta página, es super sencilla. Como explica Sara, hay que poner primero la URL que quieres que aparezca en la barra de navegación (la que vas a solicitar). Después hay que poner la URL que quieres ejecutar en el servidor. Así que, en tu caso, la primera es automoviles y la segunda es /secciones/productos/automovil/automovil.php?idioma=es.

    Queda así el htaccess:

    RewriteRule ^automoviles/?$ /secciones/productos/automovil/automovil.php?idioma=es [L]

    /? quiere decir “una barra 0 veces o 1 vez” o “con o sin la barra al final”.

  30. Comentario de sara bosch el 29 de Mayo de 2009 a las 13:43

    Dani, tienes razón. De hecho yo en estos casos no pongo R=301, simplemente como los enlaces del sitio se dirigen al URL amigable no hace falta redireccionar porqué sino es lo que tú dices que lo hace del revés. No te preocupes, si nadie conoce el URL real siempre te van a enlazar al URL amigable. Yo tengo sitios web hechos así y no tengo ningún problema.

  31. Comentario de Dani el 29 de Mayo de 2009 a las 20:40

    Ok, gracias Sara y DavidM,
    ha sido de gran ayuda consultar estos dias este blog.
    como ultima duda, ¿sabeis como puedo hacer para obligar a que la url siempre termine con solo una barra?
    mil gracias,
    saludos

  32. Comentario de Redireccionar URL dinamica a URL estatica | PosicionaPro el 30 de Mayo de 2009 a las 16:44

    [...] parece interesante, suscribete por email o por RSS. ¡Gracias por tu visita!.A todos nos gustan las URLs amigables. Por eso reescribimos las URLs dinámicas para convertirlas en URLs estáticas. Pero la reescritura [...]

  33. Comentario de DavidM el 30 de Mayo de 2009 a las 16:47

    # Si no hay barra al final, poner una
    RewriteCond %{REQUEST_URI} !(\.[^/]*|/)$
    RewriteRule ^(.*[^/])$ /$1/ [R=301,L]

    # Si hay más de una barra al final, poner solo una:
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)/{2,}\ HTTP/
    RewriteRule ^(.*)$ /%1/ [R=301,L]

    En cuanto a lo de redireccionar las URLs dinámicas a las estáticas, si el código que te pasé no hace nada, es porque la condición no coincide con la petición. Mira bien la URL dinámica y compárala con la condición.

    Como mi respuesta iba a ser larguilla, te he contestado con un post sobre cómo redireccionar URLs dinamicas a URLs estaticas.

    Otra cosa… Mirando tu .htaccess me he fijado que activas el rewrite engine dos veces (RewriteEngine On). Solo tienes que activarlo una vez al principio.

  34. Comentario de Dani el 31 de Mayo de 2009 a las 01:09

    Hola DavidM, lo he probado, pero hay una pega..
    Solo me funciona lo de borrar barras finales sobrantes con los archivos de la carpeta aparte (los archivos no modulares), pero con los modulos si añades barras al final redirecciona a nombredelmodulo/?mod=nombredelmodulo

  35. Comentario de max el 1 de Junio de 2009 a las 08:58

    DavidM antes que nada gracias por tu ayuda pero sigue sin funcionarme nada. Voy a postear algo de codigo para ver si sale algo mas en limpio

    HIPERVINCULO
    <a href=”/secciones/productos/automovil/automovil.php?idioma=

    .HTACCESS
    RewriteEngine on
    RewriteBase /
    RewriteRule ^/automovil/?$ /secciones/productos/automovil/automovil.php?idioma=$1 [L]

    Redirect /automovil http://www.pagina.com/secciones/productos/automovil/automovil.php?idioma=es

    Igual este ultimo redirect es el que esta dando problemas?

  36. Comentario de DavidM el 9 de Junio de 2009 a las 18:50

    RewriteEngine On

    # Para reescribir la URL, no se pone la barra al principio de la URL solicitada (la parte izquierda):

    # RewriteRule ^automovil/$ /secciones/productos/automovil/automovil.php [L]

    # Pero veo que le quieres pasar un idioma. Para hacer eso, tienes que incluirlo en la URL. Es decir, tienes que solicitar automovil/es/ o automovil/ca/ o automovil/en/ etc.

    RewriteRule ^automovil/([a-z]{2})/$ /secciones/productos/automovil/automovil.php?idioma=$1 [L]

    # Esto quiere decir que si solicito la URL http://www.pagina.com/automovil/en/ veré el contenido de /secciones/productos/automovil/automovil.php?idioma=en
    # El valor del variable que utilizas para definir el idioma (idioma=$1) tiene que coincidir. Por ejemplo, si utilizas números para mostrar los idiomas (idioma=1) la parte izquierda sería ^automovil/([0-9]+)/$
    # ([0-9]+) quiere decir “un número una o más veces”)
    # ([a-z]{2}) quiere decir “cualquier letra en minúsculas 2 veces.

    # Para redireccionar http://www.pagina.com/automovil a http://www.pagina.com/automovil/ (con la barra al final):

    RewriteCond %{REQUEST_URI} !(\.[^/]*|/)$
    RewriteRule ^(.*[^/])$ /$1/? [R=301,L]

  37. Comentario de Chema el 20 de Septiembre de 2009 a las 22:49

    Tengo un gran problema amigos, no se como hacer el cambio a URL´s amigables de estos directorios:

    /mostrarrestauranteseleccionado.php?Id=252&Restaurante=Mariscos%20El%20G%FCero%20-%20Calz.%20P.%20D%EDaz

    deberían quedar /mostrarrestauranteseleccionado/Restaurante_Mariscos_El_Guero

    saludos y muchas gracias

  38. Comentario de DavidM el 21 de Septiembre de 2009 a las 13:43

    Chema, puedes hacerlo de dos maneras.

    1) Guardar “Restaurante_Mariscos_El_Guero” en la base de datos. Por ejemplo, si tienes una tabla “restaurantes”, añade una columna “url” o algo parecido y guarda “Restaurante_Mariscos_El_Guero” allí.

    $url = str_replace(’/mostrarrestauranteseleccionado/’, ”, $_SERVER['REQUEST_URI']);

    Luego, haces un query como “SELECT * FROM restaurantes WHERE url=’$url’”

    Básicamente dejas de usar las URLs que tenías antes y las reemplazas con las “amigables”. No hace falta ni htaccess ni nada.

    2) Para hacerlo de la segunda manera, tendrías que cambiar un poco la estructura de tus URLs amigables. Tendrían que ser como:
    /mostrarrestauranteseleccionado/252/restaurante_mariscos_el_guero/

    ¿Ves como he introducido el valor de la variable Id?

    En este caso, puedes crear tus URLs pasando el título de la página y la variable Id por las siguientes funciones:

    $home = http://www.posicionapro.com

    function _prepare_es_chars($input){

    $input = strtolower($input);

    $chars = array();
    $chars['á'] = "a";
    $chars['é'] = "e";
    $chars['í'] = "i";
    $chars['ó'] = "o";
    $chars['ú'] = "u";
    $chars['ñ'] = "n";
    $chars['ü'] = "u";

    $search = array_keys($chars);

    $replace = array_values($chars);

    return str_replace($search,$replace,$input);

    }

    function _prepare_url_text($string) {

    $string = strtolower(trim($string));

    $string = _prepare_es_chars($string);

    $NOT_acceptable_characters_regex = '#[^-a-zA-Z0-9_ ]#';
    $string = preg_replace($NOT_acceptable_characters_regex, '', $string);

    $string = preg_replace('#[-_ ]+#', '_', $string);

    return $string;
    }

    function make_restaurant_url($restaurante, $id) {

    global $home;

    $restaurante = _prepare_url_text($restaurante);

    $url = $home . '/mostrarrestauranteseleccionado/' . $id . '/' . $restaurante . '/';

    return $url;
    }

    echo make_restaurant_url($nombre_del_restaurante, $_REQUEST['Id']);

    Ya tienes la URL. Ahora tienes que insertar un poco de código en el .htaccess para que el servidor pueda interpretarla.

    # .htaccess
    RewriteRule ^mostrarrestauranteseleccionado/([0-9]+)/(.*)/ /mostrarrestauranteseleccionado.php?Id=$1
    # End .htaccess

  39. Comentario de Chema el 21 de Septiembre de 2009 a las 15:03

    Muchas gracias David.

    No tengo acceso a mi .htaccess asi que creo que voy a ocupar la primera opción.
    Al ocuparla la primera, no hay que redireccionar de las dinamicas a las amigables??, Y que pasa con las páginas que ya tenía indexadas??

    saludos

  40. Comentario de Chema el 23 de Septiembre de 2009 a las 05:51

    Ya pude generar un archivo un .htaccess, ahora la pregunta es, si tomo la 2da opción, que pasa con el PageRank, enlaces, backlinks, etc de las URL´s viejas???
    Lo que yo entendí es que simplemente es la manera en que las muestra así que no debería afectar.

    Saludos

  41. Comentario de DavidM el 23 de Septiembre de 2009 a las 11:33

    Sí, hay que redireccionar las dinámicas a las amigables. Se hace así:

    # .htaccess
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /mostrarrestauranteseleccionado\.php\?Id=([0-9]+)&(.*)\ HTTP/
    RewriteRule ^mostrarrestauranteseleccionado\.php$ /mostrarrestauranteseleccionado/%1/? [L,R=301]
    # End .htaccess

    En tu caso, el problema es que como el valor de la variable “Restaurante” (Ej. Mariscos%20El%20G%FCero%20-%20Calz.%20P.%20D%EDaz) no coincide con el texto que quieres poner al final de tus URLs amigables, es imposible hacer la redirección con .htaccess.

    A propósito, mentí cuando te dije que no hacía falta el .htaccess con la primera opción. Estaba apollardado. El .htaccess para la primera opción sería así:

    # .htaccess
    RewriteRule ^mostrarrestauranteseleccionado/([_a-zA-Z0-9]+)/$ /mostrarrestauranteseleccionado.php?url=$1 [L]
    # End .htaccess

    En el caso de la primera opción podrías redirigir las URLs dinámicas a las amigables con PHP de la siguiente manera:

    if (isset($_REQUEST['Id'])) { // Si la URL contiene el parámetro "Id"...
    if (is_numeric($_REQUEST['Id'])) { // Si el valor del parámetro "Id" es un número...
    // Sacar de la base de datos la URL amigable que corresponde al valor del parámetro "Id".
    $sql = "SELECT url FROM restaurantes WHERE Id={$_REQUEST['Id']}";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);
    // Redireccionar a la URL amigable.
    header ("HTTP/1.1 301 Moved Permanently");
    header ("Location: mostrarrestauranteseleccionado/" . $row['url'] . "/");
    exit ();
    }
    }

  42. Comentario de DavidM el 23 de Septiembre de 2009 a las 11:51

    Si no redireccionas las URLs dinámicas, pierdes el PageRank, el posicionamiento, todo.

    Una URL es igual que la dirección de tu casa. Todos los meses recibo la revista “SEO Today” (me la he invetado). Acabo de mudarme así que mi dirección ha cambiado. No le he avisado ni a “SEO Today” ni a Correos. El mes que viene me enviarán la revista a mi antigua dirección. El cartero, si no sabe que ya no vivo allí, dejará la revista en mi antiguo buzón. Si lo sabe pero no sabe donde vivo, tirará la revista.

    Los enlaces son las revistas. Las páginas que enlazan con las mías son los editores de revistas. Google es Correos.

    Si no le dices a Google que la URL ha cambiado, al principio Google mantendrá la URL antigua en su indicé y le seguirá enviando PageRank, pero después de un par de días, si la URL le sigue dando una respuesta 404, quitará la URL de su índice, dejará de contar los enlaces entrantes a esa página y tirará el PageRank a la busara.

  43. Comentario de Chema el 25 de Septiembre de 2009 a las 02:37

    Muchas gracias por todos sus consejos. Pero todavía tengo unas dudas.

    He logrado poder entrar a mis archivos con la extensión php con

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ $1.php [L,QSA] [nc]

    pero todavia puedo entrar de las 2 maneras /archivo.php y /archivo, tendría que hacer un redirección?,

  44. Comentario de DavidM el 25 de Septiembre de 2009 a las 12:40

    Publiqué ayer un post sobre cómo eliminar la barra y he incluido un par de maneras de redireccionar las URLs originales a las nuevas.

  45. Comentario de Chema el 18 de Octubre de 2009 a las 09:25

    Hola de nuevo.
    Tengo un problema, me acabo de dar cuenta que en mi web, en está sección se logra entrar de muchas maneras: listo algunas:
    /registrorestaurante.php?Pagina=ranking.php
    /registrorestaurante.php?Pagina=mostrarrestauranteseleccionado.php?Id=40
    /registrorestaurante.php?Pagina=mostrarrecetaseleccionada.php?Id=11|Receta
    y asi consecutivamente. Como puedo hacer para que redireccione a /registrorestaurante.php y no lo consideren como contenido “infintuplicado”

    Gracias y saludos

  46. Comentario de sara bosch el 19 de Octubre de 2009 a las 15:34

    Hola Chema,
    Sí, este es un problema que tienen muchisimas web. Yo me lo he encontrado más de una vez y cada vez lo he tenido que solucionar de maneras distintas dependiendo de la programación. Como es bastante largo he hecho un post de como solucionar el problema de contenido duplicado por el paso de parámetros.

Escribe un comentario

Entradas realcionadas

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