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.





Urls amigables con mod_rewrite…
Artículo sobre qué son las urls amigables, sus ventajas y cómo gestionarlas….
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?
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
¡Hola viktorvaik! ¿Qué problema tienes exactamente? Mándanos las urls que quieres reescribir para poderte ayudar.
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
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
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?
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…
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.
[...] URLs amigables con mod_rewrite [...]
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
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.
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.
Aquí va un enlace muy interesante relacionado con el comentario anterior.
http://codex.wordpress.org/Using_Permalinks
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
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.
Porque no se publica el comentario?
Gracias por la respuesta, se agradece!
Pero al final lo solucioné siguiendo un tuto con un script en PHP.
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?
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!
¿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
.. 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?
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
#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]
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]
Hola Dani,
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.
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.
Así que si alguien accede a tu URL verdadero verá que se redirige al URL amigable, pero no pasa nada.
Los enlaces dentro de tu web los pones amigables también. Pero esto supongo que ya lo habrás hecho.
href=”URLamigable”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]
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
perdon quise poner en el resultado final que me tiene que quedar
http://www.pagina.com/automoviles
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”.
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.
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
[...] 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 [...]
# 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.
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
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?
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]
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
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.comfunction _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.
# .htaccessRewriteRule ^mostrarrestauranteseleccionado/([0-9]+)/(.*)/ /mostrarrestauranteseleccionado.php?Id=$1
# End .htaccess
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
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
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 ();
}
}
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.
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?,
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.
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
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.