Optimizar las redirecciones en web

28 de agosto de 2021

Casi siempre es necesario emplear alguna redirección en la web. Tres de las más comunes son: hacia la versión segura de la web, la redirección hacia el dominio principal y hacia la versión de la url con o sin www.

¿Qué es una redirección?

Una redirección es un proceso por el cual, cuando un cliente web solicita un recurso en una URL, el servidor le dice que debe solicitarlo en otra dirección. Así, el cliente volverá a pedir el recurso en la nueva URL.

Múltiples redirecciones

Además, haciendo uso del código de estado http adecuado, se le informa del alcance de la redirección. Esto es importante de cara al SEO, pero también de cara a cómo se gestionan las cachés.

A mi juicio, es muy importante usar correctamente:

  • 301 – Movido permanentemente:
    Implica decirle al cliente que el recurso ya no está disponible en esa url y que, a partir de ese momento, lo va a encontrar en la otra dirección. Esto transmite la seguridad para que el cliente pueda cachear la nueva URL o la propia redirección. Este es el código que deberíamos usar cuando, por ejemplo, hemos cambiado la estructura de URL de la web, hemos cambiado un slug en WordPress o tenemos una nueva web y no queremos perder el posicionamiento en buscadores que ya habíamos conseguido en la anterior. Con mayor o menor prontitud, el buscador intercambiará la URL antigua por la nueva y, si realmente entiende que son equivalentes, no debería ser un problema para el posicionamiento.
  • 307 – Movido temporalmente:
    Casi siempre usaremos más la permanente que la temporal, pero existen casos en los que es útil informar de que el cambio es temporal. Se me ocurre: que redirecciones a una página de mantenimiento, o que estando elaborando una nueva web, quieras usar contenidos de la antigua mientras no lo traspasas a la nueva; o que tengas un nuevo dominio específico para un servicio de tu empresa en el que piensas desarrollar una web completa, pero que, de momento, apunta a una página (landing page) dentro de la web general de la compañía.
  • 308 – Redirección permanente:
    Parecido a 301, pero no permite el cambio de método http. Este es bastante específico, pero tiene pinta de ser de esas cosas que una o dos veces, nos podría sacar de un apuro si conocemos su existencia.

Transfiriéndolo a la vida real es como si vinese el cartero a tu casa de siempre y:

  • 301 – Ya no vive aquí, vive en este otro sitio. En este caso, se permitiría enviar el correo a través de email o fax (por ejemplo).
  • 307 – No vive aquí, se ha ido a hacer un trabajo fuera y durante una temporada vivirá en este otro sitio.
  • 308 – Ya no vive aquí, vive en este otro sitio. En este caso no se permite usar otros métodos, tendría que seguir usando el correo postal.

En el 301 y 308, el cartero podría asumir que siempre vivirás en el otro sitio, e ir directamente al sitio nuevo a partir de entonces.

En el caso del 307, el cartero no sabe hasta cuando vas a estar fuera, con lo que le obligas a pasar por el domicilio original para comprobar si has vuelto.

Cómo podemos mejorar las principales redirecciones

Simplificando el tema y ciñéndome a los tres casos expuestos al principio, comparemos redirecciones hacia https, www. y dominio principal, peor hechas y, según yo lo veo, mejor hechas.

Pongámonos en el escenario de que mi web responde al dominio «dominioprinci.pal», pero por necesidad o coveniencia también quiero que esté disponible cuando el usuario entre en «dominiosecundar.io». Es bastante común, que una misma web responda al buscarla por .com y por .es, por ejemplo.

Podríamos encontrar algo como esto en los .htaccess del sitio.

En el dominio secundario:

# Redirigir hacia https
<IfModule mod_rewrite.c>
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

# Redirigir hacia www.
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.dominiosecunda.io/$1 [L,R=301]
</IfModule>

# Redirigir al dominio principal
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ http://dominioprinci.pal/$1 [L,R=301]
</IfModule>Lenguaje del código: HTML, XML (xml)

En el dominio principal:

# Redirigir hacia https
<IfModule mod_rewrite.c>
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

# Redirigir hacia www.
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.dominioprinci.pal/$1 [L,R=301]
</IfModule>Lenguaje del código: HTML, XML (xml)

Es un caso un poco extremo, pero seguro que es posible encontrarlo. Esto es lo que está pasando:

  • En el caso de entrar con el dominio secundario:
    1. dominiosecundar.io → https://dominiosecundar.io
    2. https://dominiosecundar.io → http://www.dominiosecundar.io
    3. http://www.dominiosecundar.io → https://www.dominiosecundar.io
    4. https://www.dominiosecundar.io → http://dominioprinci.pal
    5. http://dominioprinci.pal → https://dominioprinci.pal
    6. https://dominioprinci.pal → http://www.dominioprinci.pal
    7. http://www.dominioprinci.pal → https://www.dominioprinci.pal
  • En el caso de entrar con el dominio principal:
    1. http://dominioprinci.pal → https://dominioprinci.pal
    2. https://dominioprinci.pal → http://www.dominioprinci.pal
    3. http://www.dominioprinci.pal → https://www.dominioprinci.pal

Se puede conseguir todo en una sola redirección, en cada caso.

En el dominio secundario:

# Redirigir hacia https://www.dominioprinci.pal
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ https://www.dominioprinci.pal/$1 [L,R=301]
</IfModule>Lenguaje del código: HTML, XML (xml)

Redirigimos directamente a la versión https del dominio principal con www. Así, en el dominio principal no será necesario aplicar de nuevo las reglas.

En el dominio principal:

# Redirigir hacia https://www.dominioprinci.pal
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ https://www.dominioprinci.pal/$1 [L,R=301]
</IfModule>Lenguaje del código: HTML, XML (xml)

Redirigimos directamente a la versión https con www.

Las redirecciones más específicas primero

Hay casos en los que tenemos redirecciones específicas, por ejemplo, en WordPress, hemos cambiado un slug o path de una página o entrada.

# Redirigir hacia https://www.dominioprinci.pal
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ https://www.dominioprinci.pal/$1 [L,R=301]
</IfModule>

# Redirecciones específicas
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^antigua/direccion(/)?$ https://www.dominioprinci.pal/nueva/direccion/ [L,R=301]
</IfModule>Lenguaje del código: HTML, XML (xml)

Suponemos que el cliente va a acceder, inicialmente, con la URL https://dominioprinci.pal/antigua/direccion, a ver qué ocurre:

  1. https://dominioprinci.pal/antigua/direccion → https://www.dominioprinci.pal/antigua/direccion
  2. https://www.dominioprinci.pal/antigua/direccion → https://www.dominioprinci.pal/nueva/direccion/

Primero va a añadir www. al dominio, y en esa segunda redirección cambiará a la nueva url.

¿Y si cambiamos el orden?

# Redirecciones específicas
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^antigua/direccion(/)?$ https://www.dominioprinci.pal/nueva/direccion [L,R=301]
</IfModule>

# Redirigir hacia https://www.dominioprinci.pal
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ https://www.dominioprinci.pal/$1 [L,R=301]
</IfModule>Lenguaje del código: HTML, XML (xml)

Ahora, el cambio a la nueva dirección con su https y sus www y su nuevo path, se va a producir en un único paso. El segundo bloque de redirecciones no se aplicará para los casos específicos.

Deja una respuesta

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.