El término re­di­re­c­ción 301 se refiere al cambio pe­r­ma­ne­n­te de una página web de una ubicación a otra. Te ex­pli­ca­mos los aspectos técnicos y te mostramos cómo co­n­fi­gu­rar una re­di­re­c­ción 301 con el archivo htaccess del servidor.

¿Para qué se utilizan las re­di­re­c­cio­nes 301?

La re­di­re­c­ción 301 es el tipo de re­di­re­c­ción más conocido. El número 301 se refiere al código de estado HTTP su­b­ya­ce­n­te. Si bien el código de estado 404 indica que no se puede encontrar el recurso so­li­ci­ta­do, los códigos del tipo 300 hacen re­fe­re­n­cia a re­di­re­c­cio­na­mie­n­tos. Por lo general, las re­di­re­c­cio­nes 301 sirven para evitar errores 404.

Descubre los códigos de estado HTTP más im­po­r­ta­n­tes re­la­cio­na­dos con las re­di­re­c­cio­nes:

Código de estado HTTP Ex­pli­ca­ción
200 OK El servidor ha en­co­n­tra­do y muestra un recurso en la dirección so­li­ci­ta­da.
301 Moved Pe­r­ma­ne­ntly El recurso en la dirección so­li­ci­ta­da se encuentra di­s­po­ni­ble pe­r­ma­ne­n­te­me­n­te en una nueva dirección que devuelve el servidor. La dirección antigua ya no es válida.
302 Found El recurso de la dirección co­n­su­l­ta­da está te­m­po­ra­l­me­n­te di­s­po­ni­ble en una nueva dirección que devuelve el servidor. La dirección antigua puede volver a ser válida en el futuro.
303 See Other Similar al código 302, pero solo se permite solicitar di­re­c­cio­nes te­m­po­ra­les mediante pe­ti­cio­nes GET.
307 Temporary Redirect Similar al código 302; a di­fe­re­n­cia de 303, se permite al cliente cambiar el método HTTP (GET, POST, PUT, etc.) al solicitar la dirección temporal.
404 Not Found El servidor no puede encontrar un recurso en la dirección so­li­ci­ta­da.

Re­di­re­c­ción 301 para migrar co­n­te­ni­dos

Los co­n­te­ni­dos web, también conocidos como recursos, se en­cue­n­tran en las di­re­c­cio­nes web. A veces se migran co­n­te­ni­dos, es decir, el contenido permanece igual, pero la dirección cambia. Los co­n­te­ni­dos se migran, por ejemplo, cuando se cambia de HTTP a HTTPS, cuando se traslada una página web a un nuevo dominio o cuando se adapta la es­tru­c­tu­ra de enlaces para la op­ti­mi­za­ción de los motores de búsqueda. En cualquier caso, hay que evitar que los usuarios accedan a di­re­c­cio­nes sin contenido.

Si el servidor no puede asignar un recurso a una dirección, devuelve el error 404 “Not Found” en HTTP, lo cual resulta molesto para los usuarios, porque no pueden acceder al recurso buscado. Si la dirección es co­n­su­l­ta­da por un web crawler en lugar de por un humano, los errores 404 llevan a la desin­de­xa­ción del recurso asociado. Los ad­mi­ni­s­tra­do­res de páginas web intentan evitar ambas si­tua­cio­nes en la medida de lo posible.

Re­di­re­c­ción 301 para optimizar los motores de búsqueda

Además de los cambios de dirección del contenido web, las re­di­re­c­cio­nes 301 son ese­n­cia­les para la op­ti­mi­za­ción de los motores de búsqueda (SEO) y el marketing online. Las re­di­re­c­cio­nes 301 se utilizan para crear “URL canónicas” y “URL atra­c­ti­vas”, dado la im­po­r­ta­n­cia de las URL para el SEO. Además, al acortar URL con un link shortener, al que se recurre muy a menudo para enlazar landing pages en las redes sociales, también se utilizan in­te­r­na­me­n­te re­di­re­c­cio­nes del tipo 301.

¿Por qué las re­di­re­c­cio­nes 301 son tan im­po­r­ta­n­tes para el SEO? A di­fe­re­n­cia de las re­di­re­c­cio­nes 302, 303 y 307, la re­di­re­c­ción 301 tra­n­s­fie­re el “link juice” de la dirección original a la nueva dirección. Si un motor de búsqueda ha indexado un contenido y lo ha ca­li­fi­ca­do fa­vo­ra­ble­me­n­te, la re­di­re­c­ción 301 permite in­tro­du­cir el contenido en la nueva dirección ma­n­te­nie­n­do su antigua cla­si­fi­ca­ción. Así es como las re­di­re­c­cio­nes 301 hacen que es­tra­te­gias SEO complejas sean posibles. De hecho, la es­tra­te­gia mu­l­ti­do­mi­nio es un ejemplo de ellas.

¿Cómo funcionan las re­di­re­c­cio­nes 301?

Las re­di­re­c­cio­nes 301 entran en juego en el in­te­r­ca­m­bio de in­fo­r­ma­ción entre se­r­vi­do­res web y clientes, es­pe­cí­fi­ca­me­n­te cuando el servidor indica al cliente que el recurso que busca ya no está di­s­po­ni­ble en la dirección web (URL) que ha so­li­ci­ta­do y le remite a la dirección actual en la que se encuentra dicho recurso. El cliente puede ser el navegador de un usuario humano o un bot de un motor de búsqueda.

  1. El cliente intenta acceder al recurso de la dirección URL.
  2. El servidor responde con el código de estado 301 “Moved Pe­r­ma­ne­ntly” y pro­po­r­cio­na la nueva URL para acceder al recurso en la cabecera HTTP location.
  3. El cliente almacena la nueva URL en su caché; los futuros accesos a la antigua URL se re­di­re­c­cio­na­rán au­to­má­ti­ca­me­n­te a la nueva.
  4. El cliente intenta acceder al recurso con la nueva URL.

El proceso puede ilu­s­trar­se con la popular he­rra­mie­n­ta de red cURL en Windows. Accede a la página de inicio de IONOS en http://ionos.es y utiliza la opción –head para mostrar la cabecera HTTP de respuesta:

curl --head http://ionos.es

El servidor IONOS responde con el código de estado HTTP “301 Moved Pe­r­ma­ne­ntly”, la cabecera location contiene la nueva dirección: https://www.ionos.es/. Como se puede ver, la página de inicio se encuentra en el su­b­do­mi­nio WWW y utiliza el protocolo HTTPS. A co­n­ti­nua­ción, se indica a cURL que siga la re­di­re­c­ción 301 con la opción –location:

curl --head --location http://ionos.es

Ahora cURL muestra las cabeceras de dos di­re­c­cio­nes. En la segunda solicitud, el servidor responde con el código de estado “200 OK”; el recurso se ha en­co­n­tra­do y el contenido se transmite en el cuerpo de la respuesta. El mismo proceso se ejecuta en segundo plano cuando in­tro­du­ces en tu navegador la dirección.

Crear una re­di­re­c­ción 301 con un archivo htaccess

Hemos visto el papel que de­sem­pe­ñan las re­di­re­c­cio­nes 301 en la co­mu­ni­ca­ción entre el servidor y el cliente, pero ¿cómo se puede crear una re­di­re­c­ción 301 en el servidor? Hay varias formas, una de ellas es de­fi­nie­n­do las di­re­c­ti­vas de re­di­re­c­ción en el archivo htaccess del servidor Apache. Para que funcione, los módulos de Apache co­rre­s­po­n­die­n­tes deben estar activos:

Di­re­c­ti­vas Módulo Apache Ex­pli­ca­ción
Redirect mod_alias Re­di­re­cio­nes sencillas
Rewrite mod_rewrite Re­di­re­c­cio­nes complejas

Re­di­re­c­cio­nes sencillas para hacer un redirect 301 con el archivo htaccess

En primer lugar, se presenta cómo se pueden crear re­di­re­c­cio­nes sencillas del tipo 301 en el archivo htaccess. Para ello, se utilizan las di­re­c­ti­vas de re­di­re­c­ción del módulo mod_alias, que sirven para re­di­re­c­cio­nar una URL del servidor a otra URL El patrón es bastante sencillo:

Redirect 301 "/source_path" "target_URL"

Primero se redirige una URL del servidor a otra URL interna. La barra inclinada indica el comienzo de la ruta URL, es decir, la parte que va después del dominio:

Redirect 301 "/old.html" "/new.html"

Sin embargo, si se quiere hacer re­fe­re­n­cia a una URL externa, se pone como de­s­ti­na­ta­ria:

Redirect 301 "/old.html" "http://example.com/new.html"

También es posible utilizar la directiva redirect para definir re­di­re­c­cio­nes 301 de di­re­c­to­rios enteros en el archivo htaccess. Se redirigen todas las URL que empiezan por “es”:

Redirect 301 "/es/" "http://es.example.com/"

Se puede utilizar el mismo esquema para re­di­re­c­cio­nar todas las URL de un dominio a otro dominio:

Redirect 301 "/" "http://other.example.com/"

Si se pretende redirigir muchas di­re­c­cio­nes in­di­vi­dua­les que siguen un de­te­r­mi­na­do patrón, registrar cada re­di­re­c­ción in­di­vi­dua­l­me­n­te puede ser una tarea engorrosa. Para ello, se puede utilizar la directiva Re­di­re­c­t­Ma­t­ch, la cual utiliza una expresión regular para reconocer patrones y referirse a ellos:

RedirectMatch 301 regex URL

A co­n­ti­nua­ción, puedes ver un ejemplo de una entrada Re­di­re­c­t­Ma­t­ch que obtiene la categoría y el ID de los pa­rá­me­tros GET de un artículo y los introduce en su ruta:

RedirectMatch 301 "/article.php?cat=(.*)&id=(.*)" "/articles/$1/$2/"

Imagina que el dominio es example.com. Entonces, la URL http://example.com/article.php?cat=web&id=42 se re­di­ri­gi­ría a http://example.com/articles//web/42/.

Re­di­re­c­cio­nes complejas por medio de un redirect 301 en el archivo htaccess

Utiliza las di­re­c­ti­vas rewrite del módulo de redirects con Apache mod_rewrite para crear re­di­re­c­cio­nes 301 en los es­ce­na­rios más complejos. mod_rewrite se puede utilizar para definir y consultar co­n­di­cio­nes de re­di­re­c­ción, es­ta­ble­cer y leer variables de entorno y de­te­r­mi­nar reglas de re­di­re­c­ción con ex­pre­sio­nes regulares.

mod_rewrite permite encadenar reglas de re­di­re­c­ción; el módulo pro­po­r­cio­na una especie de mini lenguaje de pro­gra­ma­ción para tra­n­s­fo­r­mar distintas URL y activar re­di­re­c­cio­nes. El módulo mod_rewrite se debe utilizar con pre­cau­ción, debido a que un uso in­co­rre­c­to de él puede generar bucles infinitos.

Las di­re­c­ti­vas rewrite comienzan con la línea “Re­w­ri­teE­n­gi­ne on”, van seguidas de co­n­di­cio­nes de re­di­re­c­ción mediante Re­w­r­te­Co­nd y de una o más reglas de re­di­re­c­ción mediante Re­w­ri­te­Ru­le. Se pueden modificar las co­n­di­cio­nes o reglas mediante opciones de­no­mi­na­das “flags”. Para activar una re­di­re­c­ción 301, una de las reglas debe contener las flags L,R=301:

RewriteEngine on
RewriteCond TestString CondPattern [flags]
RewriteRule URL_path Substitution [L,R=301]

Entre las reglas y co­n­di­cio­nes de re­di­re­c­ción hay acceso a numerosas variables de en­ca­be­za­do y servidor con la forma %{HTTP_HOST}, %{REQUEST_URI}, etc., los cuales pueden ser enlazados con ope­ra­do­res y po­s­te­rio­r­me­n­te pro­ce­sa­dos con funciones. De este modo, se puede realizar casi cualquier re­di­re­c­ción, aunque la sintaxis no sea muy intuitiva.

A co­n­ti­nua­ción, se muestra un ejemplo de re­di­re­c­ción 301 uti­li­za­n­do mod_rewrite. Se pretende aplicar URL canónicas para evitar duplicar contenido en una página web. Es decir, sea cual sea la forma en que los vi­si­ta­n­tes accedan al contenido, todas las URL deben empezar por HTTPS y WWW.

Se definen dos co­n­di­cio­nes de re­di­re­c­ción, que se vinculan con la flag OR. La primera condición comprueba si HTTPS está des­ac­ti­va­do, la segunda comprueba si al dominio le falta el prefijo WWW. Mediante el flag NC, se desactiva la di­s­ti­n­ción entre ma­yú­s­cu­las y mi­nú­s­cu­las. Si una de las dos co­n­di­cio­nes es cierta, se re­di­re­c­cio­na a la versión HTTPS-WWW de la URL mediante una re­di­re­c­ción 301. Se utiliza la expresión regular (.), que recoge cualquier URL, y se inserta después del dominio uti­li­za­n­do $1*:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]

¿Cuáles son los problemas y peligros de utilizar re­di­re­c­cio­nes 301?

Las re­di­re­c­cio­nes 301 son una he­rra­mie­n­ta estándar en el de­sa­rro­llo web y el SEO. Sin embargo, hay que tener cuidado a la hora de co­n­fi­gu­rar­los; si las re­di­re­c­cio­nes se utilizan de forma in­co­rre­c­ta, pueden surgir problemas graves. El servidor puede blo­quear­se o la página puede perder su po­si­cio­na­mie­n­to en los motores de búsqueda.

Archivo htaccess corrupto al mo­di­fi­car­lo ma­nua­l­me­n­te

El archivo htaccess configura los di­re­c­to­rios del servidor web de Apache. El más mínimo cambio en el archivo htaccess puede hacer que la página web sea inac­ce­si­ble, momento en el cual aparece el famoso error 500 de servidor o el problema en WordPress “White Screen of Death”.

Es mejor hacer una copia del archivo htaccess antes de editarlo desde la línea de comandos. Para ello, cambia al di­re­c­to­rio web público de la página web y utiliza el comando cp:

cp -a .htaccess _htaccess

Si se producen errores después de haber mo­di­fi­ca­do el archivo htaccess, si­m­ple­me­n­te restaura la versión anterior:

cp -a _htaccess .htaccess

Re­di­re­c­cio­nes en­ca­de­na­das y bucles de re­di­re­c­cio­nes

Las re­di­re­c­cio­nes son útiles, pero “cuestan” un ciclo de solicitud-respuesta completo. Utilizar varias re­di­re­c­cio­nes en­ca­de­na­das implica que los usuarios tengan que esperar, lo que provoca un aumento de la tasa de rebote. Los motores de búsqueda también valoran ne­ga­ti­va­me­n­te a aquellas páginas que re­di­re­c­cio­nan varias veces seguidas. Como regla general, se puede efectuar un máximo de tres re­di­re­c­cio­nes sucesivas.

Los bucles de re­di­re­c­ción, en los que dos di­re­c­cio­nes se re­di­re­c­cio­nan la una a la otra sin parar, son fatales. Los bucles de re­di­re­c­ción producen el error ERR_TOO_MANY_REDIRECTS en el navegador de los usuarios y no les permite acceder al recurso deseado. Por norma general, conviene probar antes con cURL las nuevas re­di­re­c­cio­nes, para ase­gu­rar­se de que se obtiene el resultado deseado.

En­ve­ne­na­mie­n­to de caché in­vo­lu­n­ta­rio al utilizar la re­di­re­c­ción 301

El uso in­co­rre­c­to de una re­di­re­c­ción 301 puede traer dolores de cabeza. A di­fe­re­n­cia de las re­di­re­c­cio­nes te­m­po­ra­les del tipo 302, 303 y 307, la re­di­re­c­ción 301 en­co­mie­n­da al cliente a almacenar en caché la nueva URL. Si po­s­te­rio­r­me­n­te se quiere volver a la URL original, los clientes no reciben ningún tipo de aviso y siguen co­ne­c­tá­n­do­se au­to­má­ti­ca­me­n­te a la nueva URL. Por co­n­tra­rre­s­tar­lo, puedes utilizar re­di­re­c­cio­nes te­m­po­ra­les o asignar el valor adecuado en el en­ca­be­za­do de Cache-Control.

Configura el en­ca­be­za­do de Cache-Control con un valor de hora al definir la regla de re­di­re­c­ción 301 en el archivo htaccess. De esta modo, ga­ra­n­ti­zas que los cambios po­s­te­rio­res en el destino de la re­di­re­c­ción lleguen a todos los clientes:

ExpiresActive on
ExpiresDefault "access plus 1 hour"
Redirect 301 / https://www.example.com/

Es posible recurrir a un truco para co­n­fi­gu­rar el en­ca­be­za­do de Cache-Control en caso de que se utilicen re­di­re­c­cio­nes complejas con di­re­c­ti­vas de rewrite. Se define una variable de entorno li­mi­t­ca­che como parte de la regla de re­di­re­c­ción 301. A co­n­ti­nua­ción, se configura el en­ca­be­za­do, leyendo la variable de entorno como condición. De este modo, se garantiza una correcta co­n­fi­gu­ra­ción del en­ca­be­za­do al realizar la re­di­re­c­ción:

RewriteRule ^.* http://www.example.com/ [L,R=301,E=limitcache:1]
Header always set Cache-Control "max-age=3600" env=limitcache
Consejo

¿Has seguido una re­di­re­c­ción 301 y tu navegador se niega a acceder a la dirección original? Basta con añadir un “Query String” con cualquier contenido del tipo ?foo=bar a la dirección antigua y obligar al navegador a cargar la URL.

Ir al menú principal