El protocolo HTTP define más de 40 códigos de estado del servidor, 9 de los cuales son explícitamente para redirecciones de URL. Cada código de estado de redireccionamiento comienza con el número 3 (HTTP 3xx) y tiene su propio método para manejar los redireccionamientos. Mientras que algunos son similares, todos ellos se encargan de las redirecciones de manera diferente.
Entender cómo funciona cada código de estado de redireccionamiento HTTP es crucial para diagnosticar o arreglar los errores de configuración del sitio web.
En esta guía, cubriremos en profundidad los códigos de estado de HTTP 307 Redirección Temporal y 307 Redirección Interna, incluyendo su significado y cómo se diferencian de otros códigos de estado de redireccionamiento 3xx.
¡Empecemos!
¿Cómo funciona la redirección de HTTP 3xx?
Antes de sumergirnos en las respuestas de redireccionamiento temporal 307 y redireccionamiento interno 307, comprendamos cómo funciona el redireccionamiento HTTP.
Los códigos de estado HTTP son respuestas del servidor al navegador. Cada código de estado es un número de tres dígitos, y el primer dígito define qué tipo de respuesta es. Los códigos de estado HTTP 3xx implican una redirección. Le ordenan al navegador que redirija a una nueva URL, la cual se define en el encabezado de Ubicación de la respuesta del servidor.
Cuando tu navegador se encuentra con una solicitud de redireccionamiento del servidor, necesita entender la naturaleza de esta solicitud. Los diversos códigos de estado de redireccionamiento HTTP 3xx manejan estas solicitudes. Conocerlos a todos nos ayudará a entender mejor la redirección temporal 307 y la redirección interna 307.
Los diferentes tipos de redireccionamiento HTTP 3xx
Hay varios tipos de códigos de estado de redireccionamiento HTTP 3xx. La especificación original de HTTP no incluía 307 Redirección Temporal y 308 Redirección Permanente, ya que estos roles debían ser llenados por 301 Movido Permanentemente y 302 Encontrado.
Sin embargo, la mayoría de los clientes cambiaron el método de solicitud HTTP de POST a GET para las respuestas de redireccionamiento 301 y 302, a pesar de que la especificación HTTP no permite a los clientes hacerlo. Este comportamiento requirió la introducción de los códigos de estado más estrictos de redireccionamiento temporal 307 y de redireccionamiento permanente 308 en la actualización HTTP/1.1.
La respuesta de Redireccionamiento Interno 307 es una variante del código de estado de Redireccionamiento Temporal 307. No está definido por el estándar HTTP y es sólo una implementación del navegador local. Lo trataremos más adelante con más detalle.
Mientras que los códigos de estado de redireccionamiento como 301 y 308 están en caché por defecto, otros como 302 y 307 no lo están. Sin embargo, puedes hacer que todas las respuestas de redirección sean almacenadas en caché (o no) añadiendo un campo de encabezamiento de respuesta Cache-Control o vencimiento.
Usando 302 vs 303 vs 307 para redirigir temporalmente
Como se ve en la tabla de arriba, para redirecciones temporales, tienes tres opciones: 302, 303, o 307. Sin embargo, la mayoría de los clientes tratan el código de estado 302 como una respuesta 303 y cambian el método de solicitud HTTP a GET. Esto no es ideal desde el punto de vista de la seguridad.
«RFC 1945 y RFC 2068″ especifican que el cliente no puede cambiar el método en la solicitud redirigida. Sin embargo, la mayoría de las implementaciones de agentes de usuario existentes tratan el 302 como si fuera una respuesta 303, realizando un GET sobre el valor de campo Location independientemente del método de solicitud original. Se han añadido los códigos de estado 303 y 307 para los servidores que desean dejar inequívocamente claro qué tipo de reacción se espera del cliente. »
– HTTP/1.1. Definiciones de códigos de estado, W3.org
Por lo tanto, para redireccionamientos temporales donde se necesita mantener el método de solicitud HTTP, utiliza la respuesta de redireccionamiento temporal 307 más estricta.
Por ejemplo, redirigiendo /register-form.html a signup-form.html, o de /login.php a /signin.php.
Para los casos en los que necesites cambiar el método de solicitud de redireccionamiento a GET, utiliza en su lugar la respuesta 303 Ver Otra respuesta.
Por ejemplo, redirigir una solicitud POST desde la página /register.php para cargar una página /success.html a través de la solicitud GET.
A menos que tu público objetivo utilice clientes antiguos, evita usar la respuesta de redireccionamiento de 302 Encontrados.
Entendiendo la redirección interna del 307 para los sitios sólo de HTTPS
Si tienes un sitio sólo de HTTPS (que debería), cuando intentes visitarlo de manera insegura a través de http:// regular, tu navegador se redirigirá automáticamente a la versión segura https://. Típicamente, esto sucede con una respuesta de redireccionamiento 301 Movido permanentemente del servidor.
Por ejemplo, si visitas http://citibank.com y cargas DevTools en Chrome y seleccionas la pestaña Network, podrás ver todas las peticiones realizadas entre el navegador y el servidor.
La primera respuesta es 301 Movido Permanentemente, que redirige el navegador a la versión HTTPS del sitio.
Si profundizamos en los campos de los encabezados de la primera solicitud, podemos ver que el encabezado de respuesta de la localización define cuál es la URL segura para la redirección.
El problema de este enfoque es que los actores maliciosos pueden secuestrar la conexión de la red para redirigir el navegador a una URL personalizada. Los ataques de tipo «Man-in-the-Middle» (MITM) como este son bastante comunes. Una serie de televisión popular incluso se burló de esto en uno de sus episodios.
Además, una parte maliciosa puede lanzar un ataque MITM sin cambiar la URL que aparece en la barra de direcciones del navegador. Por ejemplo, se puede servir al usuario una página de phishing que se vea exactamente igual al sitio original.
Y como todo se ve igual, incluyendo la URL en la barra de direcciones, la mayoría de los usuarios estarán felices de escribir sus credenciales. Puedes imaginarte por qué esto puede ser malo.
Redireccionamientos seguros con Redirección interna 307
Ahora, probemos el mismo ejemplo con Kinsta. Visitar https://kinsta.com lleva a solicitudes de red como se muestra en la siguiente captura de pantalla.
La primera solicitud del sitio es como el ejemplo anterior, pero esta vez lleva a una respuesta de 307 Redirección Interna. Al hacer clic en ella nos mostrará más detalles sobre esta respuesta.
Nota: Si intentas visitar el sitio directamente con https://, no verás este encabezado ya que el navegador no necesita realizar ninguna redirección.
Observa el encabezado de respuesta del HSTS. Este es el Strict Transport Security (HSTS) de HTTP, también conocido como el encabezado de respuesta Strict-Transport-Security.
¿Qué es la HSTS (Seguridad Estricta en el Transporte)?
El IETF ratificó el HTTP Strict Transport Security (HSTS) en 2012 para obligar a los navegadores a utilizar conexiones seguras cuando un sitio se ejecuta estrictamente en HTTPS.
Es como si Chrome o Firefox dijeran: «Ni siquiera intentaré solicitar este sitio o cualquiera de sus recursos a través del protocolo inseguro HTTP». En su lugar, lo cambiaré a HTTPS e intentaré de nuevo».
Puedes seguir la guía de Kinsta sobre cómo habilitar el HSTS para que funcione en tu sitio web de WordPress.
Profundizando en el encabezado de la respuesta de la segunda petición nos dará una mejor comprensión.
Aquí, puedes ver el encabezado de respuesta de la estricta seguridad del transporte: max age=31536000.
El atributo de max age del encabezado de respuesta de seguridad de transporte estricto define cuánto tiempo el navegador debe seguir este patrón. En el ejemplo anterior, este valor se establece en 3153600 segundos (o 1 año).
Una vez que un sitio devuelva este encabezado de respuesta, el navegador ni siquiera intentará hacer una solicitud HTTP ordinaria. En su lugar, hará una redirección interna 307 a HTTPS e intentará de nuevo.
Cada vez que este proceso se repita, los encabezados de respuesta se reajustan. Por lo tanto, el navegador no podrá hacer una solicitud insegura por un período indefinido.
Si alojas tu sitio con Kinsta, puedes crear un ticket de soporte para que se añada el encabezado HSTS a tu sitio de WordPress. Dado que al añadir el encabezado HSTS se obtienen beneficios de rendimiento, se recomienda que habilite el HSTS para tu sitio.
¿Qué es una lista de precarga de HSTS?
Hay un problema de seguridad evidente incluso con el HSTS. La primera petición HTTP que se envía con el navegador es insegura, repitiendo así el problema que observamos anteriormente con Citibank.
Además, el encabezado de respuesta del HSTS sólo puede enviarse a través de HTTPS, por lo que la solicitud inicial insegura ni siquiera puede ser devuelta.
Para resolver este problema, HSTS soporta un atributo de precarga en su encabezado de respuesta. La idea es tener una lista de sitios que obliguen a HSTS a estar precargado en el propio navegador, pasando por alto este problema de seguridad por completo.
Agregando tu sitio a la lista de precarga de HSTS del navegador, se le hará saber que tu sitio aplica una política estricta de HSTS, incluso si está visitando tu sitio por primera vez. El navegador entonces usará la respuesta de Redireccionamiento Interno 307 para redirigir tu sitio a su esquema seguro https:// antes de solicitar cualquier otra cosa.
Debes tener en cuenta que a diferencia del Redireccionamiento Temporal 307, la respuesta del Redireccionamiento Interno 307 es un «encabezamiento falso» establecido por el propio navegador. No viene del servidor, del host de la web (por ejemplo, Kinsta), o del CMS (por ejemplo, WordPress).
Añadir un sitio a una lista de precarga de HSTS tiene muchas ventajas:
- El servidor web nunca ve peticiones HTTP inseguras. Esto reduce la carga del servidor y hace que el sitio sea más seguro.
- El navegador se encarga de la redirección de HTTP a HTTPS, haciendo el sitio más rápido y seguro.
Requisitos de la lista de precarga del HSTS
Si quieres añadir tu sitio a la lista de precarga de HSTS de un navegador, es necesario que compruebes las siguientes condiciones:
- Tener un certificado SSL/TLS válido instalado para tu dominio.
- Aplicar un HTTPS estricto redirigiendo todo el tráfico HTTP a HTTPS.
- Todos los subdominios deben ser servidos a través de HTTPS, específicamente el subdominio www si existe un registro DNS para ese subdominio.
- Tu dominio base debe incluir un encabezado HSTS con los siguientes atributos:
- El atributo de edad máxima debe ser fijado por lo menos 31536000 segundos (1 año).
- Se deben especificar los sub-dominios y las directivas de precarga.
- Si está sirviendo una redirección adicional, debe incluir el encabezado HSTS, no la página a la que redirige.
Añadir tu sitio a la lista de precarga de HSTS
Hay dos maneras de añadir tu sitio a la lista de precarga de HSTS.
- Enviando tu sitio a un directorio de listas de precarga de HSTS. Por ejemplo, la lista maestra de hstspreload.org es mantenida por el proyecto de código abierto Chromium y es utilizada por la mayoría de los principales navegadores (Firefox, Chrome, Safari, IE 11 y Edge).
- Añadiendo el siguiente campo de encabezamiento a tu sitio:
Seguridad en el transporte: edad máxima = 63072000; incluye sub-dominios; precarga.
Con el segundo método, la primera visita a tu sitio por el navegador no será totalmente segura. Sin embargo, las visitas posteriores serán totalmente seguras.
Puedes utilizar una herramienta online gratuita como Security Headers para verificar si tu sitio está haciendo cumplir el HSTS o no. Si te preocupa la compatibilidad de los navegadores con el HSTS, puede estar tranquilo sabiendo que el HSTS es compatible con casi todos los navegadores que se utilizan hoy en día.
HTTP Redireccionamientos 307 y SEO
Dado que una respuesta de Redireccionamiento Temporal 307 muestra que el recurso se ha movido temporalmente a un nuevo URL, los motores de búsqueda no actualizan su índice para incluir este nuevo URL. El «link-juice» de la URL original no se pasa a la nueva URL.
Esto contrasta con las redirecciones permanentes 301 Movido, en las que los motores de búsqueda actualizan su índice para incluir la nueva URL y pasan el ‘link-juice’ de la URL original a la nueva URL.
Con una respuesta de redireccionamiento interno 307, todo sucede a nivel del navegador. Por lo tanto, no deberías tener un efecto directo en el SEO de tu sitio. Sin embargo, agregar tu sitio a una lista de precarga de HSTS hace que se cargue más rápido y sea más seguro, lo cual puede ayudar a que se posicione más alto en los resultados de búsqueda.
Tened cuidado de no redirigir inadvertidamente a los usuarios y bots en un bucle de redireccionamiento infinito, causando el error de «demasiadas redirecciones«.
Resumen
La redirección de URL te permite asignar más de una dirección URL a una página web. La mejor manera de manejar las redirecciones URL es a nivel de servidor con respuestas de código de estado de redirecciones HTTP 3xx. Si tu sitio está caído por mantenimiento o no está disponible por otras razones, puedes redirigirlo temporalmente a otro URL con una respuesta de redireccionamiento temporal 307.
Dicho esto, cualquier redireccionamiento añade retraso al tiempo de carga de la página. Por lo tanto, usa las redirecciones cuidadosamente teniendo siempre en cuenta la experiencia del usuario final.