pulsa ⌘K para cambiar de herramienta
NETWORK · HTTP

Verificador de Cabeceras HTTP

Inspecciona cabeceras HTTP y postura de seguridad de cualquier URL.

server
http-headers

🌐 sitekits fetches the URL server-side (private/internal addresses are blocked). Response body is not retrieved.

§01 ACERCA DE ESTA HERRAMIENTA

Descripción general

Las cabeceras de respuesta son donde de verdad se configura la mayor parte del comportamiento de un sitio —caché, compresión, política de seguridad, CORS, redirecciones— y son justo la parte que no puedes ver en el navegador sin abrir DevTools sobre la petición correcta.

Esta herramienta pide una URL desde el servidor y devuelve las cabeceras de respuesta, más la cadena completa de redirecciones que llevó hasta ahí. Como el propio modelo de seguridad del navegador oculta a JavaScript las cabeceras de respuesta de otros orígenes, esta es una de las pocas herramientas de aquí que no puede ejecutarse por completo en tu página.

Cómo se usa

  1. Escribe una URL. El esquema es opcional: example.com se trata como https://example.com.
  2. Lee primero la cadena de redirecciones. Cada salto muestra su URL y su código de estado.
  3. Lee las cabeceras de la respuesta final.

Las cadenas de redirecciones suelen ser la respuesta

Cuando algo va lento o una URL canónica está mal, la cadena es donde se ve. Cada salto es un viaje de ida y vuelta completo, y los patrones habituales son todos evitables:

  • http://example.comhttps://example.comhttps://www.example.com son dos redirecciones donde bastaría con una. Redirige directamente al host y al esquema finales en un único salto.
  • Un 301 que aterriza en otro 301 después de migrar un sitio significa que dos generaciones de reglas siguen activas a la vez.
  • Una redirección hacia una URL que redirige de vuelta es un bucle; la herramienta se detiene tras cinco saltos en lugar de seguirlo.
  • Un 302 donde querías un 301 les dice a los rastreadores que la mudanza es temporal, así que la URL antigua conserva su posicionamiento y la nueva no acumula ninguno.

La diferencia entre 301/302 y 307/308 es el método de la petición. Históricamente los clientes convertían un POST en un GET al seguir un 301 o un 302; 307 y 308 preservan el método. Si el envío de un formulario se comporta de forma extraña detrás de una redirección, eso es lo primero que hay que mirar.

Cabeceras que merece la pena leer con atención

CabeceraQué buscar
cache-controlno-store en un recurso estático desperdicia ancho de banda; un max-age largo en el HTML hace invisibles los despliegues
etag / last-modifiedQue falten significa que cada revalidación vuelve a transferir el cuerpo entero
content-encodingQue falte gzip o br en respuestas de texto es la mejora de rendimiento más barata que existe
varyVary: User-Agent fragmenta cada caché de CDN en cientos de copias
strict-transport-securityUn max-age corto, o un includeSubDomains ausente, deja la primera petición degradable
content-security-policyConsulta el constructor de CSP para saber qué significan las directivas
x-content-type-optionsSin nosniff, un content-type mal puesto se puede reinterpretar como script
access-control-allow-originLa razón por la que falla tu fetch está casi siempre aquí, o en su ausencia
set-cookieComprueba Secure, HttpOnly y SameSite en todo lo que lleve una sesión

server y x-powered-by merecen atención por el motivo contrario: revelan versiones de software y nada más. Quitarlos no es un control de seguridad, pero no hay ningún argumento para conservarlos.

Qué no hace la herramienta a propósito

El manejador valida la URL contra una lista de bloqueo de rangos de direcciones privadas, de bucle local, de enlace local y reservadas antes de conectar, y repite esa comprobación en cada salto de redirección. Sin la comprobación por salto, un nombre de host público podría redirigir a 127.0.0.1 o a una dirección de metadatos de la nube y la petición la seguiría, que es exactamente cómo un servicio de comprobación de cabeceras se convierte en una forma de sondear desde fuera la red interna de otra persona.

Tampoco reenvía nunca el cuerpo de la respuesta. La conexión se lee para las cabeceras y se descarta. Un servicio que devuelve cuerpos arbitrarios es un proxy abierto, con independencia de que esa fuera la intención.

Las credenciales incrustadas en una URL (https://user:pass@host/) se eliminan antes de hacer la petición, así que ni se envían al destino ni se reflejan de vuelta en la cadena de redirecciones.

Ejemplos

  • Un error de CORS que no consigues reproducir. Compara access-control-allow-origin en el endpoint real con lo que espera tu código. Una cabecera ausente y una cabecera equivocada producen el mismo mensaje en el navegador.
  • Un despliegue que no aparece. Mira cache-control y age en el HTML. Un CDN sirviendo un documento cacheado lo explica más veces que la compilación.
  • Auditar el despliegue de cabeceras de seguridad. Comprueba strict-transport-security, content-security-policy y x-content-type-options en el host en producción y no en tu configuración, porque un CDN o un WAF pueden añadir, quitar o sobrescribir cualquiera de ellas.
  • Verificar una redirección canónica. Confirma que la cadena termina en exactamente un salto, en el host y el esquema que pretendes.

Notas

Las peticiones usan un User-Agent fijo que identifica a esta herramienta y tienen un tiempo límite de cinco segundos. Un sitio que bloquea agentes desconocidos responderá con un 403, y eso es una respuesta real sobre la configuración de ese sitio, no un fallo de aquí.

Los nombres de las cabeceras se muestran tal como los envió el servidor. HTTP/2 exige nombres en minúscula en el cable, así que una respuesta por HTTP/2 mostrará content-type donde una respuesta HTTP/1.1 podría mostrar Content-Type. En cualquier caso, los nombres no distinguen mayúsculas de minúsculas.

Si necesitas enviar cabeceras personalizadas, un método concreto o un cuerpo de petición, usa el probador de API REST: se ejecuta desde tu propio navegador y por eso puede hacer cosas que un servicio compartido no debe hacer.

FAQ
¿Se envía mi URL a algún sitio?
Sí: la URL va a api.sitekits.dev, que la pide desde el servidor y devuelve únicamente las cabeceras de respuesta. Un navegador no puede leer cabeceras de respuesta de otro origen, así que el paso por servidor es inevitable. La URL se procesa en memoria y no se escribe en ningún registro ni base de datos nuestros.
¿Por qué solo devuelve cabeceras y no el cuerpo?
Porque devolver cuerpos convertiría esto en un proxy abierto: cualquiera podría usarlo para descargar páginas arbitrarias a través de nuestros servidores y ocultar su propia dirección. El manejador lee las cabeceras y descarta la conexión sin reenviar un solo byte de contenido.
¿Puedo comprobar una URL interna o de localhost?
No. Las direcciones privadas, de bucle local, de enlace local y reservadas se rechazan, y la comprobación se repite en cada salto de redirección para que un nombre de host público no pueda rebotar la petición hacia uno interno. Es un límite deliberado, no un error: un servicio de descarga sin él se convierte en una herramienta para escanear las redes de otras personas.
¿Por qué veo un resultado distinto al de curl?
Casi siempre por caché o por negociación de contenido. La petición se hace desde un centro de datos de Cloudflare con un User-Agent fijo, así que un CDN puede servir un objeto cacheado distinto, y un sitio que varía según Accept-Language o User-Agent puede responder de otra forma que tu terminal.
¿Cuántas redirecciones sigue?
Hasta cinco, y muestra la URL y el estado de cada salto. Más de cinco devuelve un error en lugar de seguir indefinidamente.