Visor de cabeceras de respuesta

Escribe una dirección y lee lo que dice el servidor antes de enviar la página: la línea de estado y cada cabecera, en cada redirección del camino. Una breve nota junto a cada cabecera explica qué hace ahí.

Cualquier dirección pública http:// o https://. Sin esquema, se usa HTTPS.

O prueba github.com, wikipedia.org

La parte de una página web que nunca ves

La respuesta de un servidor web se arma como un paquete. La página es lo que va dentro de la caja. Por fuera hay una etiqueta, formada por una primera línea con un código de estado de tres cifras y luego una lista de líneas Nombre: valor llamadas cabeceras. El navegador lee primero la etiqueta y decide casi todo a partir de ella: si mostrar o descargar, si guardar una copia, si ir a otro sitio, qué cookies almacenar.

Nunca ves las cabeceras en pantalla, así que se esconden en ellas muchos comportamientos desconcertantes. Una página que no se actualiza, una redirección que da vueltas, una fuente bloqueada en otro dominio, un inicio de sesión que no se mantiene. Casi siempre, es una cabecera con un valor equivocado.

Qué hace este visor

Nuestro servidor envía una solicitud GET a la dirección que escribes, del mismo tipo que envía un navegador, y registra la respuesta. Si la respuesta es una redirección (un estado 3xx con una cabecera Location), solicita la nueva dirección y también la registra, hasta ocho veces. Obtienes un bloque por respuesta, en orden, para ver qué servidor añadió qué cabecera en qué paso.

Buscamos cada cabecera en un diccionario de más de 130 nombres y la mostramos con su familia y una explicación de una frase. Las familias son:

FamiliaCabeceras típicasPregunta a la que responden
CachéCache-Control, ETag, Age, X-Cache¿Se puede guardar esto, por cuánto tiempo, y respondió una caché?
ContenidoContent-Type, Content-Encoding, Content-Length¿Qué hay en el cuerpo y cómo viene empaquetado?
SeguridadStrict-Transport-Security, Content-Security-Policy¿Qué protecciones del navegador están activadas?
CookiesSet-Cookie¿Qué debe recordar el navegador?
Entre orígenesAccess-Control-Allow-Origin¿Pueden leer esto los scripts de otros sitios?
ConexiónAlt-Svc, Date, Keep-Alive¿Cómo se gestiona el enlace con el servidor?
Servidor y CDNServer, Via, CF-RAY, X-Served-By¿Qué software y qué red respondieron?
DiagnósticoServer-Timing, X-Request-Id¿Cuánto tardó y cómo encontrarlo en los registros?

Un nombre que no está en el diccionario se marca como cabecera personalizada o poco común. Cualquier software es libre de inventar las suyas, así que verás esa etiqueta a menudo y es inofensiva. Las duraciones y los tamaños se convierten cuando ayuda, de modo que max-age=31536000 se muestra como 365 días.

El resumen da el estado final, la versión de HTTP que negoció nuestro servidor, el número de redirecciones, el software que nombra la cabecera Server y el número de cabeceras de la última respuesta. Aquí no se califica nada. Si quieres una puntuación, la calificación de cabeceras de seguridad te da una.

Cómo leer la línea de estado

  • 2xx: la solicitud tuvo éxito. 200 es el caso normal.
  • 301 y 308: movido de forma permanente. Los navegadores y los buscadores recuerdan la nueva dirección. 302, 303 y 307: ve allí por ahora y conserva la original como referencia.
  • 4xx: el servidor se niega, o no encuentra lo que se pidió. Un 403 en una página que se abre bien en tu navegador suele significar que el sitio bloquea las solicitudes automáticas.
  • 5xx: falló el propio servidor. Los códigos de 520 a 526 vienen de una CDN que no pudo llegar al servidor que tiene detrás.

Cuatro cosas que la gente comprueba con él

“¿Por qué los visitantes siguen recibiendo la versión antigua?”
Lee Cache-Control y Age. Un max-age largo en una página HTML significa que los navegadores no volverán a preguntar hasta que se agote. Un X-Cache o CF-Cache-Status con valor HIT significa que la CDN sirvió su propia copia y hay que purgarla.
“¿Está activada la compresión?”
Busca Content-Encoding: br, gzip o zstd. Si falta la cabecera en una página HTML, la página viaja a tamaño completo.
“¿De dónde viene esta redirección?”
Compara la cabecera Server de cada paso. Una redirección respondida por la CDN se configuró en su panel. Una respondida por nginx o Apache está en la configuración del servidor. Una que lleva X-Redirect-By nombra la aplicación o el plugin que la emitió.
“¿Qué ejecuta este sitio?”
Server, X-Powered-By y Via suelen nombrar el servidor web, el lenguaje y la CDN. En tu propio sitio conviene quitar los números de versión de esas cabeceras.

Estás viendo las cabeceras que recibió nuestro servidor en una solicitud anónima. Un sitio puede responder de otro modo a un visitante con sesión iniciada, a un navegador móvil, a otro país o a otro Accept-Language. Los nombres de las cabeceras se muestran con su grafía habitual. HTTP/2 y HTTP/3 los transmiten en minúsculas, como el bloque en bruto, y las mayúsculas nunca importan.

Preguntas frecuentes

¿Cómo veo las cabeceras de respuesta en mi propio navegador?

Abre las herramientas de desarrollo (F12, o Cmd+Option+I en un Mac), ve a la pestaña Red, recarga la página y haz clic en la primera solicitud. El panel de cabeceras muestra las mismas líneas. Este visor sirve para cuando no puedes hacerlo: en un teléfono, con un enlace que prefieres no abrir, o para ver la respuesta que recibe un cliente sin cookies.

¿Qué diferencia hay entre las cabeceras de solicitud y las de respuesta?

Las cabeceras de solicitud salen con la pregunta del navegador: qué página, qué idiomas y formatos acepta, qué cookies tiene. Las cabeceras de respuesta vuelven del servidor con la respuesta. Esta página solo muestra cabeceras de respuesta.

¿Son estándar las cabeceras X-?

El prefijo X- era una convención para cabeceras no oficiales. Algunas se volvieron universales de todos modos, como X-Frame-Options y X-Content-Type-Options. La convención se retiró en 2012, así que las cabeceras personalizadas más nuevas a menudo no llevan prefijo.

¿Por qué obtengo cabeceras distintas de las que muestra mi navegador?

Porque no es la misma solicitud. Los servidores y las CDN se adaptan al agente de usuario, las cookies, el idioma y la ubicación del cliente, y una copia en caché puede llevar cabeceras producidas horas antes. La cabecera Vary enumera qué cabeceras de la solicitud tiene en cuenta el servidor.

¿Debo ocultar las cabeceras Server y X-Powered-By?

Ocultar el nombre del producto cambia poco. Quitar los números de versión sí vale los dos minutos, porque los escáneres automáticos los usan para elegir qué fallos conocidos probar. En nginx usa server_tokens off;, en Apache ServerTokens Prod, en PHP expose_php = Off.

¿Que falte una cabecera significa que algo va mal?

Normalmente no. Content-Type es la única que se espera en casi toda respuesta con cuerpo. Las demás importan según lo que quieras. Sin Cache-Control, el almacenamiento en caché queda a la conjetura de cada navegador, y sin cabeceras de seguridad las protecciones opcionales siguen desactivadas.