Cómo crear URLS amigables con .htaccess

¿Qué es una URL amigable? Lo mejor es un ejemplo. Esto NO es una URL amigable:

htaccess1
En cambio esta SI es una URL amigable:
htaccess2

Su propio nombre lo indica: las URL amigables son más fáciles de usar y de recordar por los usuarios y también se dice (y hay quien dice que no) que son mejores para el posicionamiento en buscadores. Además describen mucho mejor los enlaces dentro de una página web y añade un mayor nivel de profesionalidad a nuestras webs.

De todas formas, cuando hemos creado una página dinámica en PHP lo normal es que tengamos URL no amigables. ¿Cómo las convertimos en amigables de manera automática? Una manera de hacerlo es con un archivo .htaccess y gracias a Apache y su mod_rewrite.

Veamos la teoría: mod_rewrite es un módulo de Apache que permite manipular en el servidor las URLs solicitadas. Es decir, cuando llega al servidor la solicitud de una URL, esta se comprueba con respecto a una serie de reglas creadas con Expresiones Regulares creadas para detectar un patrón determinado. Si se encuentra ese patrón en el URL y se cumple la condición impuesta por la Expresión Regular se sustituye el patrón por una cadena de texto o por una acción determinada.

htaccess3

IMPORTANTE: Para que todo esto funcione tiene que estar activado el módulo mod_rewrite en nuestro servidor Apache. Podemos saber si lo está simplemente con:

Y de entre toda la información recibida si el módulo está activado tendremos:
mod_rewrite

Lo más normal es que esté activado. Sino fuera así quizás tendríamos que hablar con nuestro proveedor de hosting.

Una vez sabemos que mod_rewrite está activado lo que necesitamos es un archivo .htaccess ¿Qué es un archivo .htaccess? Es un fichero de configuración utilizado por los servidores web Apache. Son archivos de texto.

¿Qué vamos a escribir en el archivo .htaccess? Como decíamos antes, una serie de Expresiones Regulares para interpretar el URL entrante y crear un URL saliente interpretable por nuestro código. Si no sabéis nada sobre Expresiones Regulares (o Regular Expressions en Inglés) es importante que leais algo sobre las mismas antes de seguir. Con una simple búsqueda en Google podréis encontrar gran cantidad de tutoriales. Si sabéis inglés, este tutorial de themeforest es muy bueno. También podéis bajaros esta hoja de referencia de Expresiones Regulares (en inglés)

Bueno, vamos a pasar a la acción. Os aconsejo que lo hagáis también vosotros improvisando casos distintos para poderlo comprender mejor. Vamos a empezar por un ejemplo sencillo: Vamos a crear dos archivos, uno index.php y otro clientes.php

index.php tendrá únicamente un enlace a clientes.php, para simplificarlo todo un poco.

Como podéis ver el enlace es ya una URL amigable. Sin embargo al hacer click sobre el enlace necesitamos interpretar esa URL que llega al servidor para que este sepa qué hacer. Creamos un archivo de texto, lo grabamos como .htaccess y escribimos en él:

Vamos a ver línea a línea. En primer lugar tenemos que activar la re-escritura de la URL, para lo cual hay que activar RewriteEngine. A continuación establecemos una Regla de Re-escritura (RewriteRule) para gestionar la página clientes.php. Como véis, estamos re-escribiendo la URL amigable clientes/juan al formato normal clients.php?id=’juan’
En esta regla de re-escritura hay dos partes. Por un lado ^clientes/(\w+)/?$ que es una expresión regular que indica:
htaccess4
Ahora vamos con la segunda parte. En la segunda parte tenemos la expresión que sustituirá a la primera parte:
htaccess5

Ahora vamos a ver el archivo clientes.php:

Haced la prueba y veréis cómo funciona perfectamente la URL amigable. Para complicar más las cosas se pueden incluir banderas al final que cada expresión. Imaginaros por ejemplo que hubiera posibles alternativas para reescribir una URL amigable, pero queremos que una vez encuentre la primera se detenga ahí y no siga contrastándose con el resto de Expresiones Regulares. Entonces la bandera a añadir sería [L]:

Tenéis todas las banderas en esta hoja de ayuda rápida de mod_rewrite.

Por último, decir que es aconsejable añadir unas pocas líneas más a nuestro código. Lo voy a hacer aprovechando para crear un nuevo ejemplo. Supongamos un caso como este:
htaccess6
El archivo .htaccess que crearíamos sería:

Hemos añadido un condicional:

para comprobar que está activado el módulo antes de hacer nada. Luego hemos añadido “RewriteBase /” que indica que el directorio base es el raíz. Si fuera por ejemplo una carpeta llamada “base” haríamos “RewriteBase /base”.
Además hemos añadido dos líneas que lo que hacen es restringir la re-escritura sólo a rutas que no existan previamente. Es decir, que no valdría por ejemplo para ejemplo.com/imagenes/logo.png. La primera línea previene los directorios que ya existan con la bandera !-d y la segunda hace que se ignoren ficheros que ya existan con la bandera !-f.

Luego, en la regla de reescritura, tenemos una entrada compuesta por números, luego va un guión (/-) y luego una cadena que puede incluir letras en mayúsculas, en minúsculas, números y guiones (por lo que 34-lampara-verde cumpliría). La salida que ya conoce nuestro código PHP (aunque esto está oculto al usuario) es producto.php?id=$1, siendo $1 el valor que hemos atrapado entre los dos primeros paréntesis (en este caso, 34). Si observáis tenemos también atrapado un segundo grupo que es ([a-zA-Z0-9-]*) y que lo podríamos recuperar con $2, pero en este caso no nos sirve.

Esto es sólo el comienzo, pero toda la base está ahí. Otra manera alternativa de conseguir URL amigables es combinar un archivo .htaccess con PHP, pero eso sería materia de otro artículo. Algunas de las lecturas recomendadas a continuación sí indican cómo hacerlo.

Lecturas Recomendadas

baluart.net: Ofrece una función muy interesante para transformar el título de una noticia (por ejemplo) y transformarlo (cambiando las letras con tildes, eñes, etc) para conseguir una frase asequible a los buscadores y navegadores – Urls Amigables con PHP
corz.org: more .htaccess tips and tricks..
nettutplus.com: Using htaccess Files for Pretty URLS
nettutplus.com: A Deeper Look at mod_rewrite for Apache
stewparkin.com: Apache Re-Writes in .htaccess
Source Rally: Make pretty URLs with PHP and mod_rewrite
AddedBytes: URL Rewriting for Beginners
webm.ag: How To Make Dynamically Generated SEO-Friendly URLs Using PHP And .htaccess
noupe: 10+ Mod_Rewrite Rules You Should Know

164 comentarios en “Cómo crear URLS amigables con .htaccess

  1. e no me sale nada–
    active el mod_rewrite y segui exactamente como dicen pero nada llamo a la pagina y me sale..
    ——
    ¡Objeto no encontrado!
    El enlace requerido no ha sido localizado en este servidor. Si usted proporcionó el enlace de manera manual le solicitamos que por favor revise los datos e intentelo de nuevo.

    Por favor contacte con el webmaster en caso de que usted crea que existe un error en el servidor.

    Error 404

    localhost
    02/06/10 21:53:21
    Apache/2.2.11 (Win32) PHP/5.2.8

  2. Hola: Estoy haciendo el ejemplo que muestras y cuando hago clic en Juan me lleva a clientes.php y me da NOT FOUND.
    Segun mi hosting tengo el mod_rewrite activado.
    El archivo .htaccess lo copio tal cual lo tenes vos y lo coloqué dentro del directorio public_html, que es el directorio donde tengo index.php y clientes.php.
    Tambien probe de ponerlo un nivel más arriba de public_html y nada.
    Podrías explicarme??

  3. En mi archivo .htaccess aparece lo siguiente:

    El problema es que también tengo una subcarpeta /puebas/ protegida con contraseña.
    En este caso, me da la impresión de que la condición “!-f” interpreta que el archivo no existe y me reescribe la URL, cuando realmente no es que no exista, sino que no se puede acceder sin introducir la contraseña.
    ¿Se te ocurre alguna manera de hacer que la regla no aplique a esa carpeta?
    He probado añadiendo “RewriteCond %{REQUEST_FILENAME} !.*/pruebas/.*” pero no funciona.

  4. Hola, estoy intentando montar url amigables en una web que tiene base de datos y php. Lo que necesito es que dentro de uan carpeta en este caso llamada pais, las url sean amigables. Tengo un index.php, y otra condado.php y este es el .hteccess que intentgo poner pero no funciona

    Deberia quedar:

    ¿como puedo comprobar si funciona la url amigable?

    ¿Puedo poenr el archivo .htacess solo en una carpeta para que actùe solo sobre esas url?
    En que puede fallar el código que pongo.
    Desconozco totalmente la programación y me resulta dificil entender lo que representa cada paso.

    Como verás estoy muy verde en esto y he intentado copiar tu código pero siempre me sale error.

  5. Hola estimado, como sería el htaccess si tengo el sgte link?:

    index.php:

    Ya intenté pero no hay caso…

    al archivo index.php y detalles.php lo tengo todo en la misma carpeta /public_html/

    Muchas gracias de antemano!.

  6. buenas. vi su tutorial de como crear url amigables. implemente para un proyecto de galerias de imagenes con bd. me muestra bien, pero cuando regreso al index.html no me reconoce y me muestra la pagina de la galeria de imagenes pero sin las fotos.

    este es mi codigo.

    me pueden ayudar en ello ?.

    saludos.

  7. Algo que no tengo todavia muy claro, es que con solo modificar el archivo .htaccess no es suficiente, sino que en cada página php tendría que modificar los links internos para que se redireccionen a las nuevas urls?

    1. Efectivamente Javine. En el redireccionamiento del archivo .htaccess pones el link que se recibe y luego, digámoslo así, su traducción al formato que PHP entiende.

  8. Hola Juan, seguí tu tutorial y me funcionó muy bien al crear la url amigable, en la barra de direcciones aparece lo que necesito (marcas/carros)pero al cargar ésta página se pierde toda la parte gráfica que está definida en los estilos css y sólo aparecen textos sin gráficos ni los logotipos de las marcas de autos que deberían estar, tambien desaparece la animación flash superior.

    Al regresar a index.php me da error 404 url no encontrada.

    El código de mi htacces es el siguiente:

    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.ofertacarro.com$
    RewriteRule ^/?$ “http\:\/\/ofertacarro\.com” [R=301,L]
    RewriteRule ^marcas/(\w+)/?$ buscar-marca.php?tip=$1

    Te agradecería una ayuda.

    Gracias de antemano

  9. Hola a todos,

    Primero de todo felicidades por el artículo llevo días buscando por internet y hasta que no he topado con este blog no he conseguido comprender como funcionan las url amigables con htaccess.

    Ara tengo una duda a ver si alguien me la puede resolver. Según el ejemplo y si no lo entiendo mal, por cada página que quiera que tenga una url amigable tengo que hace una entrada en el htaccess. El problema es que mi página web tiene multiples páginas y eso es un auténtico fastidio. Alguien me puede decir si existe alguna forma de automatizar más este proceso?

    Gracias y saludos,

    1. Depende de la estructura de las url de tus páginas. Como verás en el artículo, puedes establecer un patrón que englobe todas tus paginas.

  10. Dios existe!! Gracias por tan grande aportación.
    LLevo dos dias intentando hacer funcionar un .htaccess para activar el mod_rewrite? y me era imposible.
    He aprendido a hacerlo y me funciona.
    Ahora mismo me dedico a crear personificados.
    Gracias gracias

  11. Me parece excelente este turorial.
    Solo una consulta si tuviera una url asi como esta

    Como sería la configuración de mi htaccess?
    Gracias de Antemano, por la ayuda.
    Saludos,

    1. Hola Fernando,

      Cuando tienes dos variables puedes probar a hacer algo así:

      Dentro del primer paréntesis va la expresión regular para la primera variable y en el segundo para la segunda, de tal manera que la url te quedara miweb.com/nombredelapagina/8073-2010

      No sé si es así como lo quieres.

  12. La verdad no se que estoy haciendo mal… No me esta funcionando.
    Habilite el modulo en el apache estoy usando el xampp, baje unos archivos para ver si me esta funcionando el modulo mod_rewrite y efectivamente me esta funcionando.
    Lo cree para la el ejemplo que puse arriba y nada.
    Hice otra regla para otra página e igual no me funciona /cry.
    Página siguiente:

    Que entonces lo que estoy haciendo mal?
    Gracias.

      1. Si todos esos pasos ya los realice, probe que funciona con unos archivos que baje de internet para problar la funcionalidad del mod_rewrite y me funciono.
        Este ejemplo era haciendo click en un link, ok pero si yo quiero que desde que me cargue la página, se vea ocultando las variables, no me esta funcionando.
        Lo otro es que en el menu el link esta como:

        debe estar asi? o en el menu yo debo de cambiar el url?
        Porque estuve leyendo en varios blog que suspuestamente con agregar el htaccess, no hay que hacer ningun cambio en la aplicación.
        Por último la regla que definí en la parte de arriba es la correcta?

        Muchas Gracias por Responder.
        La verdad ha sido de mucha ayuda.

        1. Como es el enlace que pones para que vaya a ese link? porque los números 16 y 45 (siguiendo con tu ejemplo) tienen que aparecer y la primera parte sólo incluye letras y no números ([a-zA-Z]+) mientras que dices que cid=16. El enlace parece quedar un poco raro, ya que pones que sea algo así como cid/sid.htm sin más?

          1. Ah ok ya primera parte esta mal , deberia de agregarle los números, es que no estoy muy práctico…
            Lo que quiero en realidad es ocultar mi url real.
            En el menú de mi aplicación no he realizado ningún cambio en los link, van igual por ejemplo: subcategoria.php?cid=16&sid=45
            donde el cid es el código de mi categoria y el sid es el de mi subcategoría.
            El htacess es solo como lo puse arriba me hace falta algo mas?
            es problema es que ya coloque el archivo htacess y el url me sigue saliendo:subcategoria.php?cid=16&sid=45
            no cambia nada.

  13. buenas tardes jack, he realizado todo deacuerdo a tu explicación pero no sale nada.
    me explico
    1. archivo .htaccess

    lo coloque tal cual como tu dices.
    en index.php tengo lo siguiente

    pero este enlace me sigue saliendo igual y cuando pincho en el enlace el resultado es igual
    muchas gracias por tu ayuda.

  14. Hola, vengo siempre a tu blog ya que encuentro cosas realmente interesantes y muy bien explicadas, he puesto en practica más de un tutorial sobre wordpress y siempre con éxito. Gracias por eso!
    Bueno, esto te lo debia, ahora mi duda: Si yo tuviera una variable de url del tipo…

    …para llamar a los distintos archivos, tendría un único menú (en otro include) que se vería asi:

    Mi pregunta es, cómo hago para que las urls se vean: dominio.algo/empresa/ sin tener que cambiar los links internos, ya probé con htacces y no lo consigo, incluso probé algunos generadores htacces on line y tampoco resulta. Será que simplemente no se puede.
    Gracias por tu tiempo.

    1. Gracias Daniela por tus comentarios.

      Ten en cuenta que si quieres que las urls se vean dominio.algo/empresa/ los links tienen que ser así:

      o también

      Y luego con htaccess haces la conversión a index.php?page=home para que así lo entienda tu código de php.

      1. Excelente. Mis url son amigables. Tengo una consulta,porque a partir de eso es que cuando quiero realizar un sitemap en forma automatica me repite cada carpeta como si fuera la base. por ejemplo alimentiaweb.com/acerca-de-alimentia tambien pone alimentiaweb.com/clientes/acerca-de-alimentia
        Cual seria el error?
        Gracias

  15. Excelente tus comentarios. Solo deseaba consultarte si en mi portal al hacer click en “ver mas” de una empresa, redirecciona a $emp = “empresa_detalle.php?id=”.$tr[‘id’] donde id es un numero y la url seria (en el caso de una empresa determinada) empresa_detalle.php?id=124 y deseo aparezca en vez de 124 el nombre de la empresa en este caso EFITECNICA GROUP que debo hacer?

    1. Hola Hector, gracias por tus comentarios.

      Si el id va a ser siempre 124 para este caso concreto simplemente sería hacer algo así:

      Si el número del id varía no tienes más remedio que incluirlo en la url.

  16. Muy buenas Juan,
    estoy intentando utilizar un htaccess para mi web, pero no me funciona con las secciones.
    No me da problema en la home, pero cuando intento escribir la url de una sección me da un 404.
    Es más sencillo que el tuyo y puede que esté mal porque le falten cosas (y yo no lo sepa)
    El código es este:

    Una ayudita :'(

  17. Hola Juan. Buenísimo el post. Tengo una duda. Cuando haces esto tanto la url antigua como la nueva siguen activas. Es decir que por ejemplo google detectaría contenido duplicado. Se debería por tanto según he leído por ahí hacer un redireccionamiento desde la URL antigua hacia la nueva. Lo estoy intentando hacer pero no me sale. Lo puedo hacer desde php pero preferiría hacerlo con una regla en htaccess. ¿Me podrías por favor echar una mano?.

    Gracias de antemano

    1. Gracias Jose,

      ¿Puedes poner un ejemplo del enlace que usas? Ten en cuenta que la parte de la izquierda es la URL amigable y la de la derecha la real.

      1. Por supuesto:

        Gracias

          1. Hola Jose,

            Lo tienes al revés en el htaccess. Ten en cuenta que a la izquierda va la amigable y a la derecha la real. La del .php tiene que ir a la derecha

          2. ¿Pero cual de las dos tengo al revés?. Esta me acepta la ulr sin .php así que va bien

            y la otra es la que redirecciona y no lo hace bien. ¿Serías tan amable de poner el código como dices?. Gracias y perdona por ser tan torpe.

          3. Perdona Jose por no ser claro. A la izquierda va la amigable (la que no tiene .php) a la derecha va la real (la que tiene .php que es la que entiende tu código). La que no te funciona es la que tienes al revés.

            Como la amigable tu código no la entiende por eso la cambias con el htaccess a la que sí entiende.

          4. Ok. ahora entiendo lo que querías decir. Perdona si no he sabido explicarme. El código me va bien, lo que pasa es que con la línea que dices que tengo al revés no quiero hacer lo mismo que antes. Eso ya lo tengo con la primera línea. Es decir si meto tanto la URL amigable como la que acaba en .php ambas me llevan al mismo sitio. Lo que pretendía con la segunda regla era hacer un redireccionamiento. Es por eso por lo que lo tenía al revés, justamente para decirle que si la url acaba en .php redireccione hacia la amigable. Con otras URLS dinámicas si que me va, pero no entiendo porqué se me resiste esta. ¿alguna idea?.
            Gracias

          5. Ah ya te entiendo. Para hacer un redireccionamiento tendrías que hacer así:

          6. Si pero así sería si la dirección fuese fija como inmobiliarias.php pero no como inmobiliarias-(.*).php
            Acabo de dar con una posible solución que hace lo que quiero, pero es curioso que funciona bien con casi todas las provincias menos con Barcelona, jeh jeh que raro. Este es el código completo:

  18. Hola que tal? estoy aprendiendo sobre mvc y urls amigables y estoy montando un pequeño sistema de gestion de socios para que funcione como intranet para el club de mi barrio que aparte como ayuda a mi club me sirve para aprender un poco, bueno basta de vueltas, lo que pasa es que quiero hacer que se vean urls amigables y no se como encarar, tengo activado mod_rewrite pero no entiendo bien el tema de la expresiones, por ejemplo yo tengo el formulario de ingreso y al ingresar a la pagina principal me sale la siguiente url

    me gustaria que esto se vea mas amigable y la verdad no se como encararlo si me dan una mano les agradeceria, saludos cordiales.

  19. Hola Jose, buenas tardes
    Estoy con el tema de url amigables, he buscado por todos lados pero no logro hacer que funcione, te paso una ejemplo de mi link :

    Necesitaria saber como crear el htaccess, el codigo php puse el siguiente pero tampoco funciona :

    Me puedes ayudar con esto??

    Gracias

    1. Disculpa, antes tenia el siguiente codigo apuntando al link :

      Saludos!

  20. Hola juan, mira mi problema es que mediante una variable en un embed recojo una url pero si coloco esa url en la barra hace descarga directa desde mi host de pruevas podria denegar cualquier descarga desde el .htaccess pero que en el embed reproduciera el archivo…gracias.

  21. Hola, recien me estoy intruyendo en esto del trabajo con .htaccess… me gustaria saber si me puedes hechar luz a lo siguiente:

    Tengo una web con las siguientes urls:

    La cuestion es que me gustaria cambiar por lo siguiente:

    Como deberia escribir esto dentro del .htacess
    Hay alguna forma de probar esto antes… por ejemplo trabajando de forma loca.
    Muchas gracias.
    Martin.

    1. Hola Martin,

      Si no tienes ningún parámetro que pasar en el GET puedes hacer un simple redireccionamiento 301 del tipo:

      Si los números de la primera URL son parámetros necesarios, tienen que aparecer de alguna manera en la segunda url para podérselos pasar a tu código.

  22. Muy muy muy buen artículo. Me aclaró un montón de dudas y aprendí muchas otras cosas que desconocía. También está explicado de lujo, sin abarrotar de tecnisísmos, para que la gente lo entienda mejor. Mis felicitaciones.

    Por otro lado tengo una pequeña duda, a ver si entre varios podemos resolverla.

    Tengo una web con la siguiente url: http://www.web.com/?pagename=tus-stars&ficha=id

    El .htacces que he creado (solo pongo la parte que he creado yo, lo demás viene de WordPress) es la siguiente:

    Pero no me funciona, alguna sugerencia al respecto ?

    Gracias !!

  23. Hola a todos… observen la url q bota mi web:

    mi pregunta es ¿como debo modificar el htacces.. quiero q me quede algo asi?

    otra cosa.. este es mi htacces:

    AYUDA POR FAVORRR– se los agradecere mil veces mil…
    saluds

    1. Hola Gabriel,

      He eliminado tu enlace con la info de tu configuración de php porque puede ser inseguro para ti.

      Un URL como el que quieres le vas a tener que hacer por PHP. Mediante htaccess tienes que pasar los valores de las dos variables (siempre y cuando estas sean necesarias), que son “subaction” e “id”, tal y como ves en los ejemplos del artículo.

  24. Buenas tardes, he utilizado tu tutorial para crear urls amigables en una web que estoy montando en php.
    Funciona perfectamente, pero me surge un problema.
    Si yo mismo escribo un enlace del tipo: http://miweb.com/no-existe, en lugar de mandarme al index.php como hacía antes, me salen los mensajes de Warning:no such file etc.

    Mi pregunta es, en el caso de que no exista la página en un directorio determinado, en este caso miweb.com/pages/x, ¿se puede mandar al usuario al index.php o a la tipica página de error o habría que hacerlo en php en pages.php?
    El contenido de mi pages.php (el que saca una página u otra) es:

  25. Le he añadido

    para que no salgan los warning, pero lo que me interesa es que cuando salga un Warning, me envíe a una página determinada o bien redirija a 404.

    Gracias

  26. Juan, genial aporte una vez más!

    Aun así me ha surgido un problema con mi .htaccess. Tengo un directorio en mi web llamado “rss” (cuyo fichero inicial es un index.php) y, con el siguiente codigo .htaccess, no me deja acceder. Debe ser porque supone que es uno de los menús de la web y no un directorio.

    Además, con .htaccess, habia protegido el directorio “rss” con contraseña.

    ¿Habría alguna manera de poder tener ambos códigos en el mismo .htaccess y que no entrasen en conflicto? Quizá con alguna condición previa… no sé muy bien.

    Espero vuestra ayuda! Saludos!!

      1. Gracias por responder Juan.

        Pues aun así, cuando accedo a http://www.dominio.com/rss, me intenta leer el menu rss de una de mis páginas web (como si fuese a empresa, quienes-somos, servicios…) y no a la carpeta rss (dónde dentro hay un archivo index.php que es el que habria de leer tras que el usuario ponga user y pass).

        Sabes a que puede ser debido?

        Muchas gracias.

  27. Gracias maestro!!! Sos un genio la verdad… no solo me salio esto en 15 minutos, si no que aprendí bastante de como manejar los .htaccess, me sirvió completamente para lo que lo necesita…
    Mil gracias!

    Saludos desde Argentina ^^

  28. que tal, yo tengo una duda al usar dos o mas reglas
    tengo lo siguiente:

    se supone que al poner L, buscaría el que mas se parezca, pero a mi no me funciona, la segunda regla parecería que la ignora, ayúdeme por favor

  29. ola juan
    solo quiero decirte q esta muy bueno el tutorial q subiste solo q es la primerva vez q copy hace
    una url amigable en mi wamp tengo hatcess tengo q modificar mi apache

  30. Hola he seguido los pasos que se dan en este post y funciona de maravilla el problema que tengo es que google no me detecta las paginas y me da error 404 cuando las paginas si que funcionan.

    El archivo htacces lo tengo de la siguiente forma

    1. Que raro, porque al fin y al cabo lo de Google no es más que un enlace… La URL a la que apunta Google es la misma que tu ves que está funcionando?

  31. no puedo recuperar la variable, haber lo explico rapido.
    tengo 2 archivos index y clientes.php tengo el httacces con el codigo q pusieron

    en index tengo un link

    en clientes tengo un

    porque no me imprime nada $id ??

  32. hola bien e llegado a tu web buscando ayuda este es mi problema no se si puedas ayudarme
    mi web es asi

    lo que quiero es esto

    lo de paginas son difententes cosas es la carpeta de las paginas php
    como iria en el .htaccess ps necesito algo de ayuda es algo simple pero ayuda es lo k necesito

    1. Hola Luis, este es el código que necesitas:
      Saludos!!

  33. Hola,

    Es muy bueno este post. Quería ver si me puedes ayudar.
    Tengo el .htaccess configurado y funcionando, pero me encuentro con un problema.

    La redirección es

    El problema es que cualquier url con el minimo de info correcta me lleva a la url redirigida

    Esto no está mal, pero me gustaría, como hace El Pais.es por ejemplo, que cuando se haga la redirección en la barra del navegador se restablezca la correcta…

    ¿Eso se puede hacer?¿cómo?

    Muchas gracias!

  34. Tengo el htaccess funcionando de maravilla, el único problema es que se pierden los estilos, el javascript y la imagenes. Puedo suponer que eso se debe a que no está interpretando las rutas de manera correcta.

    Ya varios hicieron esta pregunta y nadie ha respondido.

    ¿Cómo se soluciona este problema?

    Gracias.

  35. Como nadie supo responderme porque se perdían los estilos, pues tuve que solucionarlo por mi cuenta, y esto fue lo que encontré:

    Mi archivo htaccess tenía esto:

    en mi link ponía esta ruta:

    y la pagina se cargaba sin estilo, imagenes ni javascript, así que lo que hice fue cambiar mi htaccess a esto:

    Al parecer la barra (/) al final provoca una mala interpretación de las rutas, aunque no estoy seguro de que ese sea el motivo. Lo que si me parece interesante es que WordPress si usa la barra al final y todo funciona bien.

    En fin, al menos funcionó.

  36. Hola amigo, en primer lugar gracias por el tutorial, pero me gustaría hacerte una pregunta:
    Quiero dejar las url sin indentificador de producto, es decir que en lugar de aparecer “/333-producto..”. aparezca simplemente “/producto…”

    Según veo el funcionamiento de PrestaShop no se si esto se podrá hacer y además en el sitio que tengo el problema la importación se hace directamente desde los productos reales de la tienda, con lo cual los identificadores que quedan son bastante largos.

    Me gustaría minimizar en lo posible el problema y por lo menos poder poner los indentificadores al final de la url.

    1. Hola,

      Si, eso con Prestashop no vas a poder hacerlo facilmente, requeriría cambiar muchas cosas del core y que las URLs no se generaran a través del htaccess sino a través de PHP. El problema es que ese “333” es el id del producto, es decir, lo único importante de esa URL para que el código sepa de qué producto estamos hablando.

      1. Hola!

        Es el ID el que identifica cada producto, por lo que es complicado…. Para páginas estáticas no hay problema, pero para las páginas dinámicas como Productos o categorías… Es la manera en la que están hechas las urls amigables de prestashop, a través del htaccess y no de PHP.

        1. correcto amigo, de lograr la solucion se puede, solo hay que meterle mano al codigo, pero no es un imposible…fijese un planteamiento amigo . . .

          tengo un link :

          (tanto el id como el codigo son unicos en la base de datos, solo que modificar todo el sistema para que realize las busquedas por Codigo es bastante complejo jejeje )
          es decir, estoy pasando 2 variables via GET, pero solo necesito el Codigo para la construccion del URL AMIGABLE. como omito el id_producto???

          me gustaria construir la regla para la URL amigable sea la siguiente:

          HE COLOCADO las siguentes opciones pero no logro hacer funcionar, me pueen ayudar por favor, saludos.

          yo me pregunto, como hacen las webs de noticias para crear una url amigable con el titulo de la noticia,sabiendo que ese titulo va amarrado a un Id_Noticia?????

          ejemplo:

          lo convierten en

          estaba estudiando especificamente el caso con Prestashop 1.3.1 y estaba leyendo un link interesante…http://www.prestashop.com/forums/topic/114477-tutorialeliminar-el-id-de-los-productos-en-las-url-amigables
          , lo probe pero no me funciono, pero estaba pensando como hacerlo a mi manera metiendole codigo a prestashop (que es lo mas pesado) o tratando de hacerlo con url amigables, que opinas amigo?

          1. Hola Miguel,

            Hay otra manera de crear URLs amigables y es directamente en el código PHP sin usar htaccess. De esa manera sí puedes eliminar los IDs, lo que pasa es que Prestashop no usa ese sistema. Lo puedes ver por ejemplo con WordPress, donde no tienes el ID del post en la URL.

        2. correcto amigo, cierto lo que dice de meter la mano al codigo y crearlo sin el ID, tal como wordpress, y tengo una ventaja, tengo creado en la BD un campo unico igual que el ID_PRODUCT, pero que se llama Codigo_Identificador (que es alfanumerico, ejemplo DVD-999) asi que a trabajar!!!! una vez tenga lista la solucion lo posteare para ayudar a otros!!! saludos desde venezuela!!!!

  37. Hola Juan, primero que nada darte las gracias por el artículo que está excelente. Ahora tengo una consulta para realizarle y es que tengo un problema de visualización.
    Por ejemplo si visualizo así: miweb.com/marcas/nokia en ese caso se pierde el estilo de la página y no encuentra las imagenes ni nada.
    Ahora si visualizo así: miweb.com/marcas-nokia en ese caso se ve todo correctamente.

    Mi archivo htaccess es el siguiente:

    Muchas gracias por su tiempo!

  38. Hola, tu ejemplo me funciono perfecto.
    Mi pregunta es como lo hago que funcione dinamicaménte, osea meter php en el archivo .htaccess, para que el “id” cambie según en la pagina que este.
    Gracias…

  39. Otra pregunta ¿como la haría mas corta aun…?

  40. Muy bien explicado, llevaba mucho tiempo en no hacer funcionar con el Appserver 2.5.7 , crei que era por la versión del appserver que no funcionaba pero en realidad es la forma en que se llama desde el archivo .htaccess, Las URL’s amigables es una alternativa de usar al momento de dar seguridad y no visualizar los datos enviados tanto por mod GET o POST, gracias por la explicación muy detallada.

  41. Hola, despues de ver este tutorial y un poco de copy/paste logre tener un .htaccess de la siguiente forma:

    de esta forma garantizo que todas las peticiones que se hagan a mi pagina, primero pasen por el index.php, pero ahora necesito hacer que si viene una peticion a una carpeta especifica que tengo dentro de mi web, no la procese el index.php, sino que entre directo a la carpeta. Gracias

  42. Quiero que en el sitio web el dominio sea sin www, las páginas sin extensión php, que si a alguien se le ocurre entrar con extensión redirija a sin extensión, que al página de index vaya a dominio para evitar duplicados al ser igual. La web todavía no está indexada en google porque estoy de pruebas. ¿Sería el .htaccess correcto así?

    Un saludo y gracias

  43. Jose
    Muy bueno tu tutorial y en especial tu asistencia.
    Te agradezco mucho.
    Tengo un problema con el redireccionamiento. El link es amigable y la instruccion del htaccess funciona al llevarme a la direccion real, el problema es que en la barra de direccion me muestra la direccion real y no la virtual..
    Que me falta o en que estoy errado?
    Gracias de antemano
    Carlos

  44. 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?

  45. Hola!

    Todo va bien hasta ahora.

    Mi problema consiste en que tengo varios enlaces en mi web y siempre que hago el proceso me carga la primera linea que me “traduce”.

    Lo que deseo es cargar cuantos documentos php quiera, pero que me salgan como Url´s  Amigables.

     

    No se cual es el ERROR.

    Gracias.

    1. Hola,

      Lo malo es que si tienes dos reglas iguales, como es el caso, tomará sólo una de ellas. ¿No tienes forma de diferenciarlas?

  46. Saludos

    He seguido el tuto de piez a cabeza y la verdad es que me ha funcionado. solo tengo un problema

    al momento de recuperar el valor de la variable id en el archivo clientes el echo sale vacio. no se si algo este mal o que onda. cheque los archivos y al parecer todo esta correcto. si alguien pudiera decirme en que estoy mal.

     

    el modulo de apache esta activado y la redireccion funcionan el problema es que se supondria que yo haria algo con ese parametro que pasa por el metodo get . muchas gracias por el post es algo educativo pero me quedo a medias 😉

  47. Espectacular, muchas gracias amigo.

    Sobre todo estaba buscando como poner dos direcciones diferentes o dos rutas dierentes y gracias a tí quedó bien. Lo pongo a qui por si os sirve.

    Ahora voy a investigar como poner las primeras lineas en vez de

  48. Hola Juan,  me puedes ayudar por favor ?

    Para obtener en la url: direccionweb.es/videos  sale  bien.

    Para obtener en la url: direccionweb.es/videos/cine/38

    no sale, me puedes ayudar?  muchas gracias Juan.

    1. Hola Santi,

      En el segundo tienes dos variables, la de la categoría y la del id, mientras que en la expresión regular sólo tienes una. Te falta la del número del id. Prueba con:

  49. Hola.

    Hay alguna manera de que se muestre la URL amigable sin tener que cambiar todos los enlaces de la web?

    Es decir, que en el html siga habiendo

    pero al entrar en el enlace, el navegador muestre dominio.com/usuario/jose

    Muchas Gracias.

  50. Hola que tal, me podrían ayudar con una regla de reescritura de htaccess?

    Y quiero cambiar la regla para que también me pase las variables y haga esto:

    Alguna sugerencia que me puedan dar ya que apenas estoy aprendiendo esto del .htaccess

    Gracias.

  51. Buenas tarde, primero agradecerte tu tiempo y tu información sobre php y SEO. Tengo un cliente que le hicieron la web desde 0 en php. Le estoy acondicionando para SEO y me encuentro que las urls no son amigables. En el index.php tengo esta llamada:

    En principio no tenía ningún .htacces pero valorando tu artículo lo incluí de esta manera:

    El problema es que sigue sin funcionar las urls amigables. Se que algo no estoy haciendo bien. Puede ayudarme, gracias de antemano.

    1. Hola Jose,

      La URL debería ser del tipo:

      Y en el htaccess

      ¿No sería así?

  52. No no me ha funcionado.

    Te pongo la línea entera del index.php

    Otra cosa como puedo saber que en mi servicio de hosting en myphpadmin tengo el mod_rewrite activado. Siento desconocer tanto sobre este tema.

    Gracias nuevamente y saludos

    1. Hola Jose,

      Perdona que con las prisas creo que te contesté mal. Mira la respuesta que te dí que la he editado. A ver si ahora te funciona,

  53. Juan buenas tardes sigo sin conseguirlo. El problema es que cuando uno no ha realizado la programación y se encuentra este problema SEO es dificil averiguar donde modificar para poder insertar las urls amigables como toca.

    He modificado el .htaccess y nada. Pienso que lo mejor sería pasarte el index.php para que vieras la estructura total y pudieras aconsejarme o indicarme que camino coger. Si te parece bien te lo envío, y comentamos.

    Saludos y nuevamente mil gracias.

  54. Hola,

    He buscado en muchos sitios y no consigo solucionar el problema, tengo en el calendario de la web contenido triplicado en todos los eventos:

    Debería verse únicamente como una de ellas o por lo menos crear una url limpia para que ?instance_id=xxxxx no salga.

    Saludos y gracias.

  55. Hola, a mi no me funciona, tengo el siguiente código:

    y mi archivo PHP es así:

    ¿Cómo tendría que ser? Yo lo intente y nada..

  56. Cordial saludo.

    Soy nuevo en PHP y MySQL. Me enargaron un sitio ya terminado, y no he podido corregir la generación de URLs. Cuando se generan elimina los acentos y la ñ pero sin poner nada en su lugar (solución=solucin, España=espaa, etc).
    Ejemplo:

    Y el título de la página sale como “egipto nuestra nacin est incendindose”

    En .htaccess tengo:

    y creo que se generan con este código:

    Espero me puedas ayudar. Muchas gracias por tu tiempo.

  57. Hola, estoy intentando hacer url amigables pero por mas que lo intento no me sale bien. a ver si me podeis ayudar.

    tengo mi web creada con php. necesito esto

    y tengo eto

    todas las paginas se encuentrar en raiz y los datos estan almacenados en una base de datos.

    espero que me podais ayudar

      1. perdon el enlace correcto es

        y el codigo que he puesto es el mismico que tu pones en tus ejemplos de mas arriba

        1. Hola Fernando, no tendrías que poner exactamente el mismo código, sino uno adaptado a tus urls. ¿Cual es la url de origen y cual la que quieres que sea la definitiva?

  58. Si lo mas gracioso es que ne local me funciona

    En mi hosting solo estoy empezando a ponerlas en funcionamiento y pense que que mejor momento que al leer tu tutorial, entonces

    cree el archivo index2.php que llama a clientes.php

    en index2.php puese href=”clientes/juan” por tanto cuando pincho en el enlace debería aparecemre en clientes.php el nombre juan pero no aparece

    1. ahora funciona pero he tenido que poner esto en la cabecera

      ¿porque he tenido que poner Options-Multiviews?

      Me lo han dicho en mi hosting

      1. No estoy muy puesto en Apache pero creo que es porque tu servidor tiene Multiviews activo. Con esa instrucción lo desactivas. Tenerlo activado no es bueno y puede darte problemas con las redirecciones, como era tu caso.

  59. Sí, si esta activado ya me lo han confirmado y yo tambien después de hacerlo funcionar lo que no entiendo es lo que hace la opcion Options -Multiviews

  60. Tengo un problema, cuando pongo este codigo:

    e intento entrar a la pagina que seria en este caso capchew.in/Cualquier.cosa,js o capchew.in/otraCosa me suelta un error 500 (Internal Server Error). Si lo cambio a:

    funcionaría pero a la vez quiero que incluya los siguientes caracteres ( . _ – ). Tambien intente ponerlo con ([a-zA-Z0-9._-]+) pero no funcionó.

  61. bueno asi seria pero si kieres hacer la prueba tu enlace debe ser asi

    suerte
    correo:a_anonymousb@hotmail.com

  62. Hola tengo un listado de noticias

    en el htacces puse lo siguiente:

    pero cuando clico en cualquier articulo, la url del articulo no toma el titulo ¿que estoy haciend mal?

    gracias

  63. Hola Juan quería hacerte un pregunta…

    ¿es posible ocultar un directorio…en vez de crearlo como en el ejemplo?

    esto

    por…

    el directorio clientes es real tiene carpetas con fotos archivos de los clientes.

    gracias anticipadas
    carlos

     

     

  64. Muy Buen Post, por fin comprendo como funciona htaccess. no me sirve tal cual ya que no me funciona $_GET cosa que he logrado haciendo una chapuza, he llamado a la url

    le he recorto todo lo que no preciso, es decir, de

    le hice un substr dejando solo my-articulo con lo que me he servido para crear las url amigables en una web.
    Dejo el comentario para agradecerte y ampliar la información para el que quiera chapucear un poco.

  65. hola profe como estas tengo una duda

    mi url es 

    y la quisiera asi

     

    mi pregunta es ; es una tienda online y monto mis productos a la base de datos cree un campo en la base de datos para usar el seo asi ; que la llame strSEO que pongo el nombre del producto disco-sata-500-gb por ejemplo como hago para que la url pase “localhost/tienda/” las categorias despues a subcategorias  y por ultimo me coja el producto que tengo en mi base de datos

    mil gracias e estado leyendo mucho y no consigo el llamado a la base de datos y no se donde se hace mil gracias de nuevo

     

  66. Hola,

    Excelente explicación sobre como crear url amigables con htaccess en un servidor Apache, pero quisiera saber si puedes darme alguna pista, de como hacer lo mismo en un servidor de hosting bajo Windows que soporta ASP clásico y ASP.Net. Gracias por tu respuesta.

    Peter.

  67. Buenas noches, tengo el siguiente problema, mi url es

    y quiero que salga al final

    hasta ahora con

    , solo me sale

    y no interp

  68. Hola. Trato de hacer una redirección de una URL, para convertirla en otra
    Ejemplo de PRODUCTOS
    de:

    a:

     
    de:

    a:

    CATEGORIAS
    de:

    a:

    Tambien me gustaría saber como cambiar solo una parte de la url.. solo la parte que señalo.

    de:

    a:

  69. A todos lo que no le funcionó, tienes que deshabilitar el modo [Options Indexes FollowSymLinks MultiViews] a [Options Indexes FollowSymLinks] en su archivo de configuracion de apache.

  70. estimado, despues de semanas de busqueda, ensayo y error por montones, di con tu tutorial y lo que no habia logrado en semanas, lo hice en un par de horas gracias a tu tutorial.
    muy bien explicado, facil y lo mejor de todo, funciona de maravilla.
    saludos.

  71. Hola, quisiera consultar como trabajar con .htaccess y base de datos… me explico, estoy en un proyecto en cual lo etoy trabajando con DW (DreamWeaver) tengo una base de datos en la cual cada tabla contiene un atributo SEO en donde a travez de un form ingreso mi texto seo del estilo *** este-es-una-ulr-amigable-de-prueba *** mi pregunta es como redireccionar urls amigables con base de datos. Saludos.

  72. saludos, excelente post ahora lo probe en mi web y funciono perfectamente osea en: /buscando/usuario. Tengo en la raiz de de mi dominio un index que tiene paginacion con registro osea: index.php?ver=1 aplique la misma formula y funciona osea index.php/1. Pero cuando hago eso tengo en error en otras paginas, no muestra el contenido que deveria de detener me direcciona al index de la raiz de mi dominio, a que se debe el error saludos.

  73. Buenas, fantástico articulo, pero me pregunto… ¿este método funciona a la inversa? Es decir, ¿Con este sistema los buscadores podrán indexar mi contenido y mostrar mi pagina como midominio.com/clientes/juan o /clientes/pedro o tantos clientes como tenga?

  74. Hola, al principio estaba muy contenta con este tutorial porque creía haber hecho correctamente la url amigable.Pero en sólo me funciona en el primer link.
    Estoy creando una web en un directorio de mi web (nuevaweb) en php pero de momento no estoy pasando variables, ni creo que las vaya a pasar. He utilizado el código del .htaccess pero sin las variables:
    Explico mi caso con un ejemplo con 3 url: index.php, clientes.php y paco.php, este es mi htaccess:

    Los enlaces los hago asi:

    El primer link me sale correcto, me lleva a miweb.com/nuevaweb/clientes
    Pero cuando desde clientes.php enlazo a paco.php, falla porque se queda en clientes y en la barra de navegación aparece miweb.com/nuevaweb/clientes/paco, cuando me debería lleva a miweb.com/nuevaweb/paco

    La regla se suma. Como he modificado el codigo, no se si esta correcto. Hay muy poco internet sobre las url amigables para web estaticas

    ¿Alguna idea?

    Gracias

  75. Buenas,

    Me gustaría saber como configurar el archivo .htaccess, para que cuando me dirija a
    localhost/miweb/contacto

    me redirija hasta

    localhost/miweb/index.php/mi_controller/insert

    Probé con esto, pero no funciona:

    ¿Dónde debería estar este fichero .htaccess??

  76. Yo tengo un caso interesante:

    Deseo que mi URL:

    ***/images/theme/alfanumericocodigo.jpg

    Se vea en:

    ***/foto/alfanumericocodigo.jpg

    Siendo “alfanumericocodigo” un nombre con letras y números que va cambiando, en otras palabras solo deseo reemplazar “images/theme” por “foto”.

    ¿Alguna idea?

  77. no me funciona este codigo

  78. Necesito hacer una regla de la siguiente manera:

    que la URL /sitemap/ se vea en navegador de la siguiente manera /sitemap.html.
    sitemap.html no existe en el directorio. Tan sólo tiene q mostrar la URL ../sitemap/

    Gracias de antemano.

  79. Buenas tardes Juan,

    Tengo un caso algo diferente a todos y no me funciona: Estoy abriendo un pdf en mi aplicación php. Al abrir el pdf me muestra esta ruta: /exportar_pdf/docs/documento.pdf; lo que quiero es que no se vea en que carpeta está guardado el pdf como por ejemplo: /exportar_pdf/index.php?documento.pdf.

    Cree lo siguiente en el archivo htaccess

    Pero no me funciona, agradezco su ayuda.

  80. hola chicos
    lo que pasa es que estoy haciendo un wordpress y un plugin para modificar los titulos de entrada.
    pues ya los hice, me voy para mi pagina y me aparece todo bien.
    pero mi jefe le doy la ip de mi computador y le aparece todo feo las imagenes no se ven ,el contenido es desastrozo todo se ve muy mal ,necesito que me ayuden por favor muchas gracias..

  81. Para los que no les funciona hay que editar el archivo de configuración de apache, En ubuntu es /etc/apache2/apache2.conf
    Y en la linea:

    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted

    Reemplazar AllowOverride por All.
    Después de reiniciar el servicio apache funcionará.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.