Quitar extensión .php / .html de la url con .htaccess

[…]


por

Para poder acceder a tu url sin tener que poner la extensión de archivo y de esta forma utilizar urls más amigables, puedes hacerlo añadiendo este código en tu archivo .htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php

Con esto, podremos acceder a nuestra página www.miweb.com/contacto.php con la url www.miweb.com/contacto

 

Si además queremos el mismo efecto, pero añadiendo una barra / al final, podemos utilizarlo así:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

De esta forma accederemos a nuestra página como www.miweb.com/contacto/

 

 

Comentarios

30 respuestas a «Quitar extensión .php / .html de la url con .htaccess»

  1. Avatar de wilmar guerrero

    |

    hola muchas gracias, queria preguntar si esto es perjudicial para el SEO, pues una vez posicionado una url como «/ejemplo.html» podria generar un nuevo rastreo? podria google no identificar que ejemplo.html es igual a /ejemplo ???????????????

    1. Avatar de esther

      |

      Hola Wilmar,
      Si, puede ser si Google puede acceder a la misma página mediante /ejemplo.html y /ejemplo
      Una forma de evitarlo es usando la etiqueta canonical para indicarle que sólo una es la principal:
      <link rel="canonical" href="http://www.dominio.com/ejemplo.html" />

      1. Avatar de Wilmar Guerrero

        |

        wow mira después de 3 años encontré este articulo y no me habia fijado de tu respuesta, muchas gracias, en este momento soy experto en SEO (3 años después) y no quería pasar por alto tu comentario …
        muchas gracias

        1. Avatar de esther

          |

          Gracias a ti Wilmar!

          1. Avatar de Hugo

            |

            Hola Ester sobre la misma pregunta de Wilmar, según su experiencia ¿es mejor dejar de canonical «/ejemplo.html» o «/ejemplo» ?
            ¿Esto al final incide en que cuando nos busquen aparezca esa url en el buscador?

            Muchas gracias por la ayuda!
            Saludos

          2. Avatar de esther

            |

            Hola Hugo,
            Google cogerá el enlace que tu estés utilizando, si en tu menú tienes enlace a /ejemplo, aparecerá así.
            Pero una cosa es que lo tengas redirigido para temas de usabilidad y enlaces amigables, y otra que esa página sea realmente ejemplo.html, por lo que si indicas una canonical yo la pondría con extensión.
            Ojo, el SEO no es mi especialidad, así que antes de cambiar nada, consultalo con un especialista por si acaso 😉

            Saludos!

  2. Avatar de Miguel sanchez

    |

    Muchas gracias, solo que tengo un problema,, tengo miles de post indexados en google con .html al final.
    como puedo redireccionar todos los post con .html al final hacia este ejemplo:

    domonio,com/ejemplo-post-2017

    estoy usando wordpress, alguna forma de redireccionar todos automaticamente sin usar .html?

    1. Avatar de esther

      |

      Hola Miguel!
      Precisamente es lo que se explica en este artículo, sin tener que modificar los archivos ni urls en sí, con htaccess le dices que si alguien va, por ejemplo a dominio.com/ejemplo-post-2017, cargue automáticamente la página dominio.com/ejemplo-post-2017.html

      Espero haberme explicado, cualquier duda me lo dices!

      Saludos,

      1. Avatar de Miguel

        |

        Hola!
        Y el caso contrario? Es decir tengo enlaces de entrada viejos a mi web.com/ejemplo.html y ahora mi enlace de wordpress es
        web.com/ejemplo
        Entones provocan error 404… Como puedo arreglarlo?

        1. Avatar de esther

          |

          Hola Miguel,
          Ese caso es diferente, yo tengo este código apuntado para hacer lo que comentas, pero ojo, hace mucho que no lo pruebo, así que tesetalo bien antes:
          RewriteRule (.+)\.html?$ http://example.com/$1/ [R=301,L]

          Saludos!

          1. Avatar de Miguel

            |

            Gracias! Lo probaré…

          2. Avatar de RIcardohlazo

            |

            Aun funciona!!!1 Gracias

  3. Avatar de Joaquin

    |

    Hola, soy nuevo aquí, y llevo algún tiempo buscando la manera buena de quitar la extensión .html de mis url.
    La verdad, aún no me ha funcionado ninguna, y es que no explican si en mi documento html debo cambiar mis url. Es decir…Yo tengo Inicio. Y no sé si debo quitarle el .html a ésta etiqueta también, o dejarla como está, y que el .htaccess haga su trabajo.
    He hecho todo lo que se supone que hay que hacer, crear el .htaccess, copiar el código que se enseña, subirlo en la carpeta raíz tal como se indica, junto con el resto de archivos, pero al actualizar mi sitio, siempre me da error..y es desesperante. No sé si hay que crear un redireccionamiento, o es que saltan algún paso..o yo no hago algun paso bien, que también puede ser… Muchas gracias por compartir tu conocimiento, y a la espera de comprobar si funciona o no.

    1. Avatar de esther

      |

      Hola Joaquin,

      Hay dos temas que comentas, uno respecto a los enlaces. Si la redirección funciona correctamente, en los enlaces de tu web debes quitar el «.html» de los links y dejarlos como «href=’/contacto/’», por ejemplo.

      Pero si dices que al subir el .htacces al servidor te da siempre error es que hay algún error en ese archivo o alguna restricción de tu servidor. Te recomendaría que contactases con el soporte técnico del hosting para que te aclararan si puedes utilizar el módulo rewrite en tu servidor.

      Saludos!

  4. Avatar de Marcos

    |

    Hola, que puede pasar que no me funciona ? lo estoy probando en local usando wamp, gracias

    1. Avatar de esther

      |

      Hola Marcos!
      Si no te funciona en local es posible que sea debido a la configuración del apache en WAMP, ya que es necesario que el módulo de rewrite (mod_rewrite) esté activado. Mira este artículo a ver si te sirve: http://www.orchidbox.com/post.php?title=How_to_enable_mod_rewrite_module_in_apache_in_xampp_wamp

      Saludos!

  5. Avatar de Daniele

    |

    Hola,

    Gracias por el aporte pero tengo una pregunta:
    En esta linea – RewriteRule ^(.*)$ $1.php – habría que cambiar el «1.php» por «index.php» verdad ??

    1. Avatar de esther

      |

      Hola Daniele!
      No, los números que aparecen no hacen referencia a páginas en concreto, sino son variable de las reglas de rewrite. Pruébalo tal cual está, a mi me funciona así.

      Saludos!

  6. Avatar de Joshep

    |

    Hola, yo tengo direcciones dinámicas de acuerdo a mis usuarios, es decir, por ejemplo tengo un archivo ingresar.php pero al iniciar sesión un usuario, la ruta se cambia a ingresar.php?id=2; esto debido al id que tiene el usuario en sesión.
    Al quitar la extensión, también se quitaría el ?id=2 o más bien tendría problemas con esto?
    Gracias.

    1. Avatar de esther

      |

      Hola Joseph!
      Puedes usar instrucciones rewrite en tu .htaccess para poder utilizar una estructura tipo http://www.dominio.com/ingresar/2/, que sustitiría a la url que indicas ingresar.php?id=2
      Para que te hagas una idea, esto sería usando la regla:

      RewriteRule ^ingresar/([^/]*)/([^/]*)\.html$ https://www.dominio.com/ingresar.php?id=$1 [L]

      Pero lo ideal es que busques información sobre el rewrite en htaccess para ver todas las opciones y la información completa, ya que es un archivo muy delicado que puede provocar error en toda la web.

      Saludos!

  7. Avatar de Estella

    |

    Hola, tengo varias páginas indexadas con .html al final, y en el wordpress nuevo ahora no me pone la extensión… pero con este código que indicas en el htaccess no me redirige de la url con .html a la url sin la extensión.

    Ahora mismo tenía el htaccess así:

    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress

    pero si le añado el código de:
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^(.*)$ $1.php

    antes de cerrar lo de sin borrar lo anterior,
    no funciona la redirección, carga bien la página pero da un 404 como antes y no sé exactamente qué tendría que quitar del anterior código htaccess o cómo debería dejarlo 🙁

    muchas gracias de antemano

    1. Avatar de esther

      |

      Hola Estella,
      El código de este post se refiere a páginas a medida, en WordPress el CMS se encarga de crear automáticamente las urls amigables, que puedes configurar desde el menú Ajustes -> Enlaces permanentes, desde allí puedes indicar el formato de las urls que quieres utilizar en tu web. Por defecto el más utilizado es «Nombre de la entrada»

      Saludos!

      1. Avatar de Estella

        |

        Hola, gracias por responder tan rápido.
        Sí, así lo tengo en enlaces permanentes, pero como te digo, no funciona, sigue dando un 404 porque antes los enlaces eran
        http://www.loquesea.com/nombre-de-la-entrada.html

        siguen dando un 404 al quedarse en http://www.loquesea.com/nombre-de-la-entrada sin el .html final

        de ahí mi pregunta jeejej no son cientos de miles, pero si unos cuantos como para pensar en hacer redirecciones 301 individuales url por url… por eso pensaba si habría algo que me funcionase en htaccess pero no he sido capaz de encontrarlo

        1. Avatar de esther

          |

          Hola Estella,
          Me temo que en este caso es algo muy concreto que no te se decir más que de entrada yo probaría el siguiente código:

          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteRule ^([^/]+)/$ $1.html
          RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.html
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
          RewriteRule (.*)$ /$1/ [R=301,L]

          Sin conocer la web y configuración específica es difícil saber el problema y cómo corregirlo.

          Saludos,

          1. Avatar de Estella

            |

            Muchísimas gracias Esther.
            Realmente es como dices, es un caso concreto en el que vengo de una anterior web en Joomla en la que todas la páginas llevaban lo de .html al final, y ahora se hizo una nueva en wordpress y aunque he replicado todas las urls no he podido añadirle ese .html final mediante el apartado de enlaces permanentes.

            He probado el código que me pasas para el htaccess pero no he sido capaz de ponerlo bien y la web no funciona con él, supongo que a ese código he de dejarle alguna parte del anterior que había entre lo de # BEGIN WordPress y # END WordPress pero como no tengo experiencia no sé cómo «encajar» la parte del código que me pasas.

            De todas maneras te agradezco infinito haberme prestado tu ayuda desinteresada, eres una crack y súper amable 🙂 un saludo

          2. Avatar de esther

            |

            Muchas gracias Estella
            En principio el código que te indiqué lo podrías poner al principio de todo del archivo, pero una migración de Joomla a WordPress tiene su complejidad y es un caso muy concreto que me temo no voy a poder ayudarte sin tener acceso.

            Un saludo y suerte!!

  8. Avatar de Joel

    |

    Tengo una duda, que pasa si una carpeta y un archivo tienen el mismo nombre? por ejemplo: una carpeta de nombre blog y un archivo blog.html igual funciona?
    los archivos que se encuentran en carpetas no se le puede quitar la extensión .html sino no funciona, ya he comprobado y no se como solucionar.
    en dónde hay que copiar el archivo .htaccess o crearlo? ya que no me queda claro esa parte

    1. Avatar de esther

      |

      Hola Joel,
      El archivo .htaccess puede estar en la ruta principal de tu sitio y dentro de las carpetas, es decir, puedes tener reglas generales que afecten a todo el sitio, o algunas particulares para una carpeta en concreto.

      Saludos!

  9. Avatar de Francisco Enrique

    |

    Estoy haciendo mi primera web a puro código y necesitaba eliminar el .html y agregar una / al final de mis urls, demoré en llegar hasta aquí para encontrar el código preciso, muchas gracias por compartir tu conocimiento.

    1. Avatar de esther

      |

      Gracias Francisco, me alegro que te haya podido ser útil!