URL limpias y amigables con PHP
Para un Consultor SEO, la url de cada página tiene un valor similar sino mayor, al title de la misma página, es decir, si te has esforzado en conseguir titles SEO, y cabeceras de página con descripciones, keywords y demás, ahora te falta dedicar un poco de tiempo a configurar tu servidor apache para que muestre url limpias o amigables.
Entendiendo el concepto de url amigable
Lo primero que nos debemos preguntar es porque se dice amigable, pues bien, se le dice url amigable o limpia porque va a ser mucho más amiga de buscadores como el todo poderoso google y además también se dice limpia porque si se ha construido bien podrá ser leida por cualquier humano y se hará una idea exacta de en que parte de tu aplicación web está.
Ejemplo de url amigable vs no amigable
Por ejemplo si estuviésemos hablando de un nicho o nido de empresas podríamos poner este ejemplo
- url no amigable: http://impressas.es/empresa.php?empresa=embutidos-la-serena
- url amigable: http://impressas.es/empresa/embutidos-la-serena
Como puede observarse en la url limpia o friendly no se muestran los car acteres ? ni =, tampoco aparece el nombre del fichero php. Básicamente hacer una url de estas características consiste en usar el nombre de la variable ($_GET) como si fuese una carpeta de nuestro directorio y el valor de la variable como si fuese el nombre de una página.
Terminaciones aconsejadas de nombres de archivos
Como de costumbres los buscadores valoran más unos tipos de archivos que otros y aunque la diferencia no sea mucha es aconsejable intentar pulir nuestra url tanto como se posible, sobre todo en aquellas páginas que queremos posicionar al máximo, para ello vaemas esta clasifcación.
- Fichero terminados en html o htm, es el formato que se muestra en el navegador, por tanto es el formato que se debe esperar para cualquier página web. A mi juicio es la terminación más válida.
- Fichero php o asp también puede ser una terminación válida y yo la colocaría justo después de html.
- Terminar en /, dala impresión de ser una carpeta y vamos a acceder al index.
- No terminar en nada, tambíen puede ser daría la impresión de ser una carpeta pero es mejor y más correcto que termine en /
- Terminaciones distintas a estas no son aconsejables para url que apuntan a páginas web estandar, es decir, el buscador verá html luego la extendión del fichero se deberá corresponder ¿no?.
Hacer url limpias y amigables con .htaccess
Bueno pues vamos a lo que vamos, para hacer url limpias o amigables con PHP y apache, se pùeden usar varios modos, pero hoy nos vamos a centrar en el más extendido de todos, el uso del fichero .htaccess. Veamos de forma resumida que es el fichero .htaccess.
Un fichero .htaccess (hypertext access), también conocido como archivo de configuración distribuida, es un fichero especial, popularizado por el Servidor HTTP Apache que nos permite definir diferentes directivas de configuración para cada directorio (con sus respectivos subdirectorios) sin necesidad de editar el archivo de configuración principal de Apache.
Para hacer las url limpias con .htaccess necesitamos 4 puntos básicos:
- El fichero .htaccess, normalmente se sitúa en la raiz de nuestro servidor (/www o /httpdocs), pero algunos alojamientos lo incluyen en otras carpetas.
- El módulo mod_rewrite instalado y activado, podemos saber si esta activo o instalado usando esta función de php «php_info()», simplemente debemos hacer un fichero donde la llamemos y se nos mostrará en el navegador una tabla con los distintos módulos cargados e instalados. En esa tabla deberá aparecer mod_rewrite.
- Creación del contenido de .htaccess donde usaremos el módulo y pondremos la expresión regular que va a limpiar nuestra url.
- Cambiar los <a href=…. de nuestra aplicación y el sitemap para que la nueva configuración de url sea real.
Expresiones regulares con las que limpiar la url
Continuemos con el ejemplo anterior, queremos convertir http://impressas.es/empresa.php?empresa=embutidos-la-serena en http://impressas.es/empresa/embutidos-la-serena. Para hacerlo tendremos que utilizar una expresión regular, que convierta todo lo que sea de la forma empresa.php?empresas=valor a un simple empresa/valor.
La instrucción concreta sería:
- RewriteRule ^empresa/(.*) empresa.php?empresa=$1
- RewriteRule, índica que empieza nuestra regla de reescritura de url
- ^empresa/(.*) es la cadena que queremos convertir, es decir, el formato de la url limpia, lo que el usuario pondrá en barra de direcciones. en este caso se podría leer como todo lo que empiece por empresa/lo_que_sea
- La siguiente parte es el nombre real, es decir, el sucio. Y $1 es donde se va a guardar el valor de la variable $_GET. Y coincide con lo que vemos despues de la / en la url limpia.
- Por ejemplo para hacer que las terminaciones sean html pondríamos: RewriteRule ^empresa/(.*).html empresa.php?empresa=$1
- Si quisieramos cambiar un fichero de categorías (que surgen de una búsqueda) pondríamos poner: RewriteRule ^categoria/(.*) buscar.php?categoria=$1.
Ejemplo de fichero .htaccess
Un ejmplo sencillo para un fichero .htaccess que limpie url será:
<IfModule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRule ^empresa/(.*).html empresa.php?empresa=$1RewriteRule ^categoria/(.*).html buscar.php?categoria=$1</IfModule>
- Comprobamos que el módulo este instalado
- Lo ponemos en marcha
- La base será la raíz, aqui se pueden poner distintas carpetas
- Dos expresiones regulares para limpiar
- Fin del módulo
Aprovecha los comentarios
En todos los años que esta entrada lleva publicada muchos visitantes que han dejado en los comentarios sus preguntas y yo o ellos mismos se las han respondido. Seguramente si tienes alguna duda encontrarás allí la solución o de lo contrario no dudes en comentar para preguntar o dar tu opinión y ayudar a la comunidad.
Estoy con la página de una amiga y WooRank me dice «hemos encontrado parámetros técnicos en sus URLs» Vamos que no tiene URLs limpias. Se da el caso de que todas las páginas acaban con .html, pero según lo que pone arriba, esa no es razón para que no la considere limpia. Estoy en lo cierto?
Aparte de esto, lo único que encuentro anómalo, para que no sea considerada una URL limpia es, por ejemplo, que en el apartado «donde estamos» la URL sólo tiene puesto «donde» «http://eurogune.com/espanol/donde.html Puede ser esta la razón, por la que no la considera limpia, porque no coincide con el texto íntegro?
Muchas gracias
Mirando esto https://www.google.es/search?q=site:http://eurogune.com/&num=100&hl=es&prmd=imvns&ei=xH-_T5-OG8PChAeC_7zvCQ&start=100&sa=N&filter=0&biw=1440&bih=788
No veo url sucias, quizás este en la parte que google no indexa, eso no importaría o puede que te lo diga porque en las url tienes algunas letras en mayúsculas…
Prueba algo así
RewriteEngine On
RewriteBase /
RewriteRule ^/(.*) /carpeta/$1
Hola!
Tengo una duda que no consigo resolver, os cuento.
He realizado la reescritura:
DE: miweb.com/madrid/alcobendas
A: miweb.com/localiza.php?provincia=madrid&ciudad=alcobendas
y funciona. El problema que veo es que está dirección se actualiza en la barra de direcciones del navegador y en mi opinión pierde su objetivo.
Los enlaces de la web están utilizando la dirección limpia.
¿Existe alguna forma de que la dirección ‘sucia’ solo se utilice internamente y no cambie la url del navegador?
Le estás haciendo el 301 en el Rewrite???
@@jlmora
No.
A parte de las cabeceras tengo algo como: RewriteRule ^(.*)/(.*)$ localiza.php?provincia=$1&ciudad=$2 [R,L] y redirecciona bien. Pero lo que no me cuadra es que este cambio afecte a la dirección del navegador.
Hola jlmora, No, a parte de las cabeceras tengo:RewriteRule ^localiza/(.*)/(.*)$ localiza.php?provincia=$1&ciudad=$2 [R,L]y la redicción funciona, pero no me cuadra que esto afecte a la dirección visible en el navegador. Por que al final el usuario está viendo la url ‘sucia’.Gracias!
He estado probando de mil maneras y no consigo que funcione. Mi enlace sucio es el siguiente: www. dominio. com/ver_anuncio.php?id=1
me gustaría que mostrase por ejemplo www. dominio. com/informatica/vendo-ordenador-mac
mediante el id de la url se obtiene toda la información del anuncio. He intentado hacerlo de mil formas pero no se como hacer que aparezca el titulo del anuncio en vez del id, o como he puesto de mostrar categoria/titulo anuncio, cualquiera me serviría. Muchas Gracias a todos.
Buenas Juan Luis,
Siguiendo tus indicaciones he creado el siguiente archivo .htacces:
# Activar RewriteEngine
RewriteEngine on
RewriteBase /
RewriteRule ^alquiler-barcos-menorca/(.*).html alquiler-barcos-menorca.php?recordID=$1
Mi intención es transformar http:// www. bubbicharter .com/alquiler-barcos-menorca.php?recordID=38 en una dirección mucho más amigable, pero llevo ya varias horas probando y nada de nada. Lo he revisado muchas veces y no encuentro el error. ¿Podrías decirme en qué me estoy equivocando?
Gracias y saludos!
//No sé si tiene algo que ver, pero antes ya he activado el modulo rewrite con:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bubbicharter.com [NC]
RewriteRule ^(.*)$ http:// www. bubbicharter .com/$1 [L,R=301]
y este sí que funciona.
Hola, me gustaria saber donde puedo modificar el programa que genera las urls, a que quiero cambiar el .html final por el .htm
Asimismo quiero eliminar el codigo del articulo ya que no seirva para nada en el SEO.
Muchas gracias.
Un saludo
Hola,
Primero agradecer el articulo que es muy concreto y clarito.
Estoy un poco desesperado, llevo unas cuantas horas perdidas con las redirecciones en mi entorno de desarrollo y no consigo que el navegador no cambie la url con la redirección ‘amigable’,
Esta es mi última configuración apache:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteBase /
RewriteRule ^apps/(.*)$ «http ://izonia.localhost/izoniaapps/app_dev.php/$1» [NC,L]
Funciona, pero yo quiero que en el navegador quede:
http ://izonia.localhost/apps/lo-que-sea
y lo que hace el navegador es mostrar:
http ://izonia.localhost/izoniaapps/app_dev.php/lo-que-sea
Un saludo y gracias de antemano.
Tengo mi url limpia
http: //localhost/calular/imprimir/ -> http: //localhost/?p=calcular&op=imprimir
Pero quiero utilizar tambien algunas variales por GET, es decir hacer una especie de combinacion porque voy a utilizar formularios.
http ://localhost/calular/imprimir/?values=2&sha=tres
O algo parecido, como podría hacer ésto?
Hola.
es todo lo que se debe hacer?
no hay que modificar nada en la aplicacion web?
por ejemplo tengo esta url
index.php?content=Noticias/listar_noticias.php
no me ha funcionado =(
RewriteEngine on
ErrorDocument 404 /Error404.php
RewriteBase /
RewriteRule ^/Noticias/listarnoticias/(.*) index.php?content=$1
¿como iria?
REEDITO
gracias…!
Buenas ,
antes de nada darte mi enhorabuena , por este post, llevo varios dias peleandome con las urls amigables y he avanzado algo pero sigo con problemillas que no acabo de solucionar, mi problema es el siguiente haber que opinas y si puedes ayudarme…
tengo una pagina que tiene numerosos vinculos por ejemplo..
actividades , atractivos etc, etc
localhost/actividades/cultura por ejemplo lo consigo hacer amigable , enviandolo por
RewriteRule ^/actividades/(.*) actividades.php?id=$1, ahora viene mi problema dentro de actividades cultura tengo una sql donde listo todos los atractivos de cultura que son varios arquitecturas,museos,etc.. consigo que me liste vien todas pero ahora quiero seleccionar arquitecturas y que me liste todas las arquitecturas que me las lista en otro php. ya no me funciona se me queda siempre en esta ultima y no me abre las fichas..
RewriteRule ^/actividades/(.*) esta_actividades.php?id=$1 por ejemplo y no consigo salir de dicha pagina … no se si me he explicado bien , pero de todos modos modos gracias por todo y perdona si me he extendido
Un saludo Jose
Estimado tengo un problema
tengo una url sucia x.e : miweb/catalogo.php?id=1 y quiero que la url limpia sea miweb/catalogo/producto hasta ahora solo me sale miweb/catalogo/producto-1 donde el 1 es el id y siempre tengo q ponerlo el id pero solo quiero q vaya el nombre, aparte cdo hago que sea amigable miweb/catalogo/producto tengoproblemas enmis css
Eso no es problema de ursl sucias o limpias, es porque tu web necesita saber el ID para buscar en la base de datos.
Lo siento amigo no acabo de ver el problema, no obstante si el listado tien cierta lógica lo más probable es que puedas sacar la expreción para conseguir urls amigables, espero que tengas suerte;)
Tengo un problema en mi blog, al final de la url me aparece esto :»#.UhPUbh8n-GR». Es decir ahora que cada página que navego me muestra eso al pinal,ya sea una pagina o un post, siempre me lo agrega les dejo un ejemplo de como se ensucia mi url : …791/noticias/facebook-o-twitter-quien-me-ofrece-mayor-rentabilidad#.UhPUbh8n-GR
hola, tengo una gran duda y es muy importante con respecto a las urls limpias y los sitemaps,(es un portal inmobiliario donde las personas pueden publicar sus inmuebles) pues mi pagina le estoy haciendo el proceso de urls limpias pero una pagina similar maneja un sitemap en donde indexaron todas las urls de la pagina, y siguen creciendo pareciera que a cada publicacion le hicieran un nuevo archivo en el servidor para poder indexarlo al sitemap
se me olvido decir que pagina es mi competencia vivareal . com . co
Pues no te entiendo…
He visto cosas similares cuando se usan en WP Shortcodes para hacer los resúmenes de entradas, no se si te puede ayudar….
Hola Jose Luis:
Ten una web que actualmente genera las url de esta forma, y no tengo idea de htaccess.
¿Como puede hacer las url amigables? ¿tengo que reescribir el codigo para formarlas?
¿las Urls que estan en google (buscadores) como las redirecciono a las nuevas?
Gracias.
NUBE de articulos
una_web.com/nube_articulos.php
…/nube_articulos.php?pg=0&newlang=es
….com/nube_articulos.php?pg=0&newlang=pt
CONSULTA del catalogo
…..una_web.com/catalogo.php?inicial=A&pg=3&newlang=es
…com/catalogo.php?inicial=A&pg=3&newlang=pt
CONSULTA articulos
// si viene desde la pagina prinicipal
….com/articulos.php?nart=Añil&nregart=1105&pg=n
// si viene desde la pagina de NUBE de articulos
…..com/articulos.php?nart=Añil&nregart=1105&pg=0
// si viene desde la CONSULTA del catalogo
……com/articulos.php?nart=Añil&nregart=1105&pg=3&newlang=es
……com/articulos.php?nart=Añil&nregart=1105&pg=3&newlang=pt
La verdad que tienen mala pinta, seguramente se podrán limpiar pero hace falta conocimiento del sistema en el que esté y tienes que tocas .htaccess seguro
Hola. He creado una web pero la url me queda asi. Miweb.com/html/la.pagina.donde.me.encuentro. Yo quiero sacar el nombre de la carpeta html Que me sale siempre. No tengo idea de php. Podria hacerlo? Como? Muchas gracias por Si contestas por favor
Hola, mi problema es que cuando me meto en mi pagina aparece dos veces.es
foro-batidora . es/es
como podría quitar ese /es que sobra??
Tienes que decirte por cual es la página principal y luego hacer que la una redireccione a las otra, pero normalmente los CMS no permiten hacer esto de una forma sencilla al menos…
Buenos días tengo poco conocimiento en url amigables, tengo una web en php, programado en varias capas.tengo noticias.php y paginas.php en la raiz.
tengo noticias.php con url amigables, pero cuando quiero hacer una reglas para paginas.php me sale error.
mi codigo :
RewriteEngine On
#Rewriterule ^noticias/(.+)/(.+).html$ noticias.php?id=$1&titulo=$2
RewriteRule ^paginas(.*)/(.*).html$ paginas.php?p=$1&titulo=$2
gracias
Buenos días, Juan Luis:
Ante todo, enhorabuena por tus contenidos.
Tengo una pregunta que hacerte: ¿todavía ves útil que a día de hoy las URL terminen con la extensión .html? A mi juicio, queda muy anticuado y desfasado. Por estética y funcionalidad, prefiero acabar las URL sin la barra, para que no parezca una carpeta o directorio, con su pertinente 301 para evitar contenido duplicado (que no se pueda acceder a la URL con y sin barra).
¡Gracias!
Buenas tardes, tengo mi siguiente pregunta:
Este es mi htaccess:
# Activar RewriteEngine
RewriteEngine on
RewriteBase /plantilla/
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^([a-z]+)$ index.php?menu=$1
Con eso ahora mismo me funciona perfectamente… el problema viene cuando en mi url quiero poner por ejmplo mi-web.es/animacion/animal
Esdecir cada vez que pongo una url de 2º nivel o mayor mis rutas de css y js se desconfiguran pensado que estoy en una carpeta más…
Como puedo solucionar eso?¿
Hola, estoy migrando mi blog de wordpress.com a hosting propio, guardando el mismo dominio. Tengo post bastante bien posicionados en google. El orden actual de la url es: midominio/fecha/nombredelpost, si hago esa url más amigable y suprimo la fecha aprovechando la migración a hosting propio, puede afectar esto el posicionamiento de esos artículos?.
Gracias
Si claro que afectaría porque estarías perdiendo las antiguas urls. Debes hacer redirecciones 301 o usar algún pluging
Saludos, gracias por el post primero, una duda, si por ejemplo solo quisiera que se mostrara la raìz, como serìa
por ejemplo que siempre se mostrara: www . mipagina . com
en lugar de www . mipagina /missecciones
Hola, tengo un problema con url que dan error 404, estas url en realidad no existen en la tienda, pero están continuamente saliendo en «páginas no encontradas » del admin de Prestashop, intente eliminarlas desde herramientas de webmaster, pero Google no hace caso, continúan saliendo, tengo más de 3000 » no se encuentra » en errores de rastreo, las url que dan error salen de esta forma.
midominio.com/collares-de-diseno-elegante/w
ww.midominio.com/collares-de-d
iseno-elegante/3030-collares-d
e-buy-onlinees-vintage-en-cuer
o.html
Tienes idea de que puede estar sucediendo?
Un saludo
Daniel
Lo que tienes que buscar es que enlaces las generan y eliminarlos
se haría un rewrite para que cuando se solicite el dominio se muestre dicha url.
Pero en tu caso creo que lo que tienes que hacer es indicar al dominio que inicie en esa carpeta o configurar tu CMS para que tome como index el dominio raiz
Yo diría que es porque tienes las rutas a css mal definidas de esta forma /…. En lugar de ser absolutas
Eso no es por estética… La páginas finales una estructura en árbol normalmente son ficheros y por tanto tienen extensión. El resto son carpetas y por eso acaban en /
La regla para páginas no está bien colocada según veo…
Interesante comentario, por favor me gustaría contar con tu sincera apreciación respecto a mi pagina para que sea una pagina con cumplimiento del responsive, de URLs con terminación htm o html
los hemos convertido como las que aparecen actualmente, pero con este cambio se me cayo notablemente mi posicionamiento
Saludos
Mario
Hola Juan, he estado leyendo y buscando información sobre este tema pero no me termino de aclarar. Quiero cambiar algunas url de mi web que tienen guiones bajos a través del .htaccess como en este ejemplo:
RewriteRule ^listado-ofertas-empresas$ /listado_ofertas_empresas.php [R=301]
y he cambiado los a href a las nuevas urls. El cambio me funciona, si pongo la nueva url me lleva al contenido pero en la barra del navegador vuelven a aparecer las url viejas. Por otro lado, he leido que las rewriterules no cambian las url del navegador, entonces si es así ¿sirve de algo? o es que yo no lo estoy haciendo bien.
Gracias por adelantado.
La url del navegador si cambia, hazlo como en el ejemplo de este post.
Hola,
Estoy siguiendo tus explicaciones y hay algo que estoy haciendo mal:
Tengo en index.php un href=/info/us/ y mi web entiende info.php?country=us para ello he puesto en mi .htaccess
RewriteBase /
RewriteEngine on
RewriteRule ^info/(.*).html info.php?country=$1
No me funciona ¿es correcto? He comprobado si tengo el módulo activo y lo tengo.
Gracias por la ayuda
La sintaxis no tiene mala pinta pero a la segunda parte le falta el comienzo de la ruta.