En resumen: cURL oculta los encabezados de respuesta de forma predeterminada. Usa-ipara ver los encabezados junto con el cuerpo,-Ipara una solicitud HEAD que devuelva solo encabezados,-vpara una depuración completa de la solicitud/respuesta, y-Dpara guardar los encabezados en un archivo. Para la programación moderna, cURL 7.83+ te permite extraer encabezados individuales o volcar todos ellos como JSON con la-wopción de salida.
Introducción
Los encabezados de respuesta HTTP son los metadatos que un servidor devuelve con cada respuesta, y abarcan desde el tipo de contenido y las políticas de almacenamiento en caché hasta los contadores de límite de velocidad y las directivas de seguridad. Cuando estás depurando una API inestable, verificando que una CDN está sirviendo los encabezados de caché correctos o comprobando si un sitio establece la política CORS adecuada, la primera herramienta a la que recurren la mayoría de los desarrolladores es cURL.
Por defecto, cURL solo muestra el cuerpo de la respuesta en stdout, lo que significa que hay que solicitar explícitamente los encabezados de respuesta HTTP en cURL antes de poder verlos. El problema es que cURL ofrece al menos media docena de opciones y técnicas para mostrar esos encabezados, y cada una está optimizada para un flujo de trabajo diferente. ¿Deberías recurrir a -i, -I, -v, o -D? ¿Y qué hay de las nuevas -w variables de salida que te permiten extraer un único encabezado por su nombre o exportar todos los encabezados como JSON?
Esta guía repasa todos los métodos para ver los encabezados de respuesta HTTP en cURL, desde la línea de comando más sencilla hasta recetas de scripts aptas para la automatización, para que puedas elegir la herramienta adecuada para cada tarea sin tener que memorizar cada sección de la página de manual.
Por qué los encabezados de respuesta son importantes para la depuración y el scraping
Cada respuesta HTTP lleva un conjunto de encabezados que indican al cliente cómo interpretar la carga útil. Un Content-Type encabezado que dice application/json significa una cosa; text/html significa otra. Más allá de lo básico, los encabezados revelan el comportamiento del almacenamiento en caché (Cache-Control, ETag), los requisitos de autenticación (WWW-Authenticate), el estado de limitación de velocidad (X-RateLimit-Remaining) y las políticas de seguridad (Strict-Transport-Security, Content-Security-Policy).
Para quienes se dedican al web scraping, los encabezados de respuesta son especialmente reveladores. Pueden indicarte si un servidor está comprimiendo sus respuestas, si tus solicitudes están siendo redirigidas a través de una cadena de URL intermedias o si estás a punto de alcanzar un límite de velocidad. Por eso, aprender a inspeccionar los encabezados de respuesta HTTP en cURL de forma rápida y precisa es una habilidad fundamental para cualquiera que trabaje con HTTP en la línea de comandos.
Cómo ver los encabezados de respuesta HTTP en cURL: tabla de referencia rápida
Antes de pasar a los ejemplos, aquí tienes una tabla comparativa que puedes guardar en tus favoritos. En ella se asigna cada indicador a su comportamiento y al escenario en el que resulta más útil cuando necesitas mostrar los encabezados de respuesta HTTP en cURL.
|
Indicador / Técnica |
Qué hace |
Ideal para |
|---|---|---|
|
|
Imprime los encabezados de respuesta + el cuerpo juntos |
Inspección visual rápida de una respuesta |
|
|
Envía una solicitud HEAD, imprime solo los encabezados |
Comprobación rápida de los encabezados cuando no necesitas el cuerpo |
|
|
Muestra la solicitud y la respuesta completas, incluido el protocolo de enlace TLS |
Depuración profunda de toda la transacción HTTP |
|
|
Guarda los encabezados de respuesta en un archivo |
Registra los encabezados por separado del cuerpo |
|
|
Solicitud GET, imprime solo los encabezados en stdout |
Cuando las respuestas HEAD difieren de las GET |
|
|
Extrae un único encabezado por nombre (cURL 7.83+) |
Comprobaciones programadas de un encabezado específico |
|
|
Muestra todos los encabezados como JSON (cURL 7.83+) |
Canalización de encabezados a |
Elige la fila que se ajuste a tu flujo de trabajo y lee la sección correspondiente a continuación para ver detalles y ejemplos.
Mostrar los encabezados de respuesta junto con el cuerpo (-i)
La forma más sencilla de ver los encabezados de respuesta HTTP en cURL es la -i (forma larga: --include). Indica a cURL que anteponga el conjunto completo de encabezados de respuesta a la salida del cuerpo, separados por una línea en blanco.
curl -i https://httpbin.org/getLa salida comienza con la línea de estado (HTTP/1.1 200 OK), seguida de cada encabezado en su propia línea, luego una línea en blanco y, finalmente, el cuerpo de la respuesta. Se trata de una solicitud GET, no de una solicitud HEAD, por lo que obtienes la respuesta real que el servidor enviaría a un navegador.
Utiliza -i cuando quieras echar un vistazo rápido tanto a los encabezados como al cuerpo con un solo comando de terminal. La desventaja es que los encabezados y el cuerpo se mezclan en un solo flujo, lo que dificulta su análisis mediante programación. Para la creación de scripts, una de las técnicas posteriores (como -D o -w) suele ser más adecuada.
Recuperar solo los encabezados de la respuesta (-I y --head)
Cuando solo necesites los encabezados y no te importe en absoluto el cuerpo, utiliza -I (o su forma larga equivalente, --head). Ambas opciones envían una solicitud HTTP HEAD, que pide al servidor solo los encabezados.
curl -I https://httpbin.org/getLa salida es solo la línea de estado más los encabezados. Sin cuerpo, sin ruido adicional. La --head ortografía hace lo mismo, pero se lee con mayor claridad en los scripts de shell, lo que hace que tu intención resulte obvia para cualquiera que revise el código.
Una advertencia: una respuesta HEAD no siempre es idéntica a una respuesta GET. Algunos servidores devuelven encabezados diferentes (o omiten ciertos encabezados por completo) para las solicitudes HEAD. Si estás solucionando un problema con un encabezado que solo aparece en un GET real, esta bandera te llevará a conclusiones erróneas.
Imprimir solo los encabezados en una solicitud GET
La solución alternativa es la -s -o /dev/null -D - técnica, que envía una solicitud GET completa pero descarta el cuerpo e imprime solo los encabezados de respuesta en stdout:
curl -s -o /dev/null -D - https://httpbin.org/getEsto es lo que hace cada parte: -s silencia el indicador de progreso, -o /dev/null envía el cuerpo a ninguna parte, y -D - escribe los encabezados a stdout (el guión significa «stdout» en lugar de un nombre de archivo). Esto te proporciona los encabezados GET reales sin el ruido del cuerpo, y es un patrón esencial cuando necesitas encabezados de respuesta HTTP precisos en cURL pero HEAD no es fiable.
Inspecciona la solicitud y la respuesta completas con el modo verboso (-v)
El modo verboso es la navaja suiza de la depuración HTTP. El -v (o --verbose) hace que cURL imprima la transacción completa: detalles del handshake TLS, encabezados de solicitud, encabezados de respuesta y el cuerpo.
curl -v https://httpbin.org/getEn la salida, las líneas precedidas por > son los encabezados de solicitud que envió tu cliente, las líneas precedidas por < son los encabezados de respuesta que devolvió el servidor, y las líneas que comienzan con * son mensajes informativos del propio cURL (información de conexión, negociación TLS, etc.).
Para reducir el ruido, combina -v con -s para suprimir el indicador de progreso. Si quieres capturar solo las líneas de encabezado de la salida detallada en un script, puedes redirigir stderr (donde -v escribe su información de depuración) y filtrar:
curl -vs https://httpbin.org/get 2>&1 | grep '^<'Esto canaliza tanto stdout como stderr juntos, y luego conserva solo las líneas que comienzan por <, lo que te proporciona una lista limpia de encabezados de respuesta a partir de la salida detallada de cURL. Es ideal para una depuración rápida y puntual, aunque para la creación de scripts de producción te interesarán los enfoques más estructurados que se tratan a continuación.
Guardar los encabezados de respuesta en un archivo (-D)
La -D (abreviatura de --dump-header) escribe los encabezados de respuesta en un archivo en lugar de en stdout. Combínala con -o para guardar el cuerpo por separado:
curl -D headers.txt -o body.html https://example.comUna vez ejecutado, headers.txt contiene todos los encabezados de respuesta y body.html contiene el contenido de la página. Esto es ideal para el registro, donde se desea archivar los encabezados y el cuerpo juntos para su revisión posterior.
Para el registro con marca de tiempo (útil en scripts de monitorización), genera el nombre del archivo dinámicamente:
curl -D "headers_$(date +%Y%m%d_%H%M%S).txt" -o /dev/null https://example.comCada ejecución crea un nuevo archivo como headers_20240615_143022.txt, para que puedas seguir cómo cambian los encabezados de respuesta HTTP en cURL con el tiempo. Combina esto con una tarea cron y tendrás un monitor de encabezados ligero sin necesidad de herramientas de terceros.
Extrae encabezados específicos con grep y awk
A veces solo te interesa un encabezado, como Content-Type o X-RateLimit-Remaining. Canalizar la salida de cURL a través de herramientas estándar de Unix te permite hacerlo rápidamente.
Extrae un único encabezado por su nombre con grep sin distinción entre mayúsculas y minúsculas:
curl -sI https://httpbin.org/get | grep -i "content-type"Para aislar solo el valor (sin el nombre del encabezado), añade cut o awk:
curl -sI https://httpbin.org/get | grep -i "content-type" | cut -d':' -f2- | xargsEl cut comando divide por los dos puntos y conserva todo lo que viene después, mientras que xargs elimina los espacios en blanco circundantes. Como alternativa, awk puedes hacerlo de una sola vez:
curl -sI https://httpbin.org/get | awk -F': ' '/^[Cc]ontent-[Tt]ype/ {print $2}'Ten cuidado con las coincidencias parciales de nombres. Si buscas Content también coincidiría con Content-Length, Content-Encodingy cualquier otra cosa que empiece de la misma manera. Busca siempre el nombre completo del encabezado seguido de dos puntos para evitar falsos positivos.
Extracción moderna de encabezados con -w (cURL 7.83+)
A partir aproximadamente de la versión 7.83 (lanzada a principios de 2022), cURL introdujo dos variables de salida que simplifican la extracción de encabezados de respuesta HTTP en scripts de cURL: %header{name} para un único encabezado y %{header_json} para todos los encabezados como JSON.
Extrae un encabezado de forma limpia, sin necesidad de grep:
curl -s -o /dev/null -w '%header{content-type}' https://httpbin.org/getEsto imprime solo el valor del Content-Type encabezado. Sin análisis sintáctico, sin tuberías, sin expresiones regulares.
Para obtener todos los encabezados de respuesta como un objeto JSON, utiliza:
curl -s -o /dev/null -w '%{header_json}' https://httpbin.org/getLa salida es JSON válido, lo que significa que puedes canalizarla directamente a jq para formatear o extraer campos:
curl -s -o /dev/null -w '%{header_json}' https://httpbin.org/get | jq '.["content-type"]'Cuando aparecen nombres de encabezado duplicados (como varios Set-Cookie encabezados), cURL los agrupa en la primera aparición y recopila todos los valores en una matriz JSON, por lo que nunca se pierden datos.
Una nota importante: estas variables de salida requieren cURL 7.83 o posterior. Ejecuta curl --version para comprobar cuál tienes. Si utilizas una versión anterior, el grep/awk enfoque de la sección anterior sigue siendo tu mejor opción.
Recetas de scripting y automatización
Una vez que puedas extraer los encabezados de respuesta HTTP en cURL, el siguiente paso es crear flujos de trabajo repetibles en torno a ellos. Aquí tienes tres patrones que funcionan bien para auditar encabezados a gran escala.
Auditar un encabezado específico en varias URL:
while IFS= read -r url; do
val=$(curl -s -o /dev/null -w '%header{strict-transport-security}' "$url")
echo "$url → $val"
done < urls.txtIntroduce un archivo de URL y obtén un informe rápido de cuáles establecen el Strict-Transport-Security encabezado.
Supervisa los cambios en los encabezados a lo largo del tiempo con diff:
curl -sI https://example.com > /tmp/headers_prev.txt
# ... wait, or run via cron ...
curl -sI https://example.com > /tmp/headers_now.txt
diff /tmp/headers_prev.txt /tmp/headers_now.txtIncorpora esto en una tarea cron y envía el resultado de diff a un webhook de Slack o por correo electrónico. Es una forma sencilla de detectar cambios inesperados en la configuración.
Crea un alias de shell para comprobaciones frecuentes:
alias hcheck='curl -s -o /dev/null -D - -w "\n"'Ahora puedes escribir hcheck https://example.com para volcar rápidamente los encabezados de respuesta de cualquier URL con una solicitud GET limpia.
Solución de problemas comunes con los encabezados
Incluso las inspecciones de encabezados más sencillas pueden salir mal. A continuación se muestran tres situaciones con las que probablemente te encontrarás al trabajar con encabezados de respuesta HTTP en cURL, junto con los indicadores que las solucionan.
Errores de certificado SSL
Si cURL se niega a conectarse debido a un problema con el certificado, puedes omitir la verificación con -k (o --insecure):
curl -kI https://self-signed.example.comUtiliza esto solo en entornos de desarrollo o de pruebas internas. En producción, la mejor solución es proporcionar el paquete de CA correcto con --cacert /path/to/ca-bundle.crt para que la conexión se verifique realmente.
Cadenas de redireccionamiento y encabezados que faltan
Por defecto, cURL no sigue las redirecciones. Si una URL devuelve un 301 o un 302, solo verás los encabezados de esa respuesta inicial. Añade -L (o --location) para seguir la cadena:
curl -LI https://example.comPara capturar los encabezados en cada salto (no solo en el destino final), combina -L con -D:
curl -L -D all_headers.txt -o /dev/null https://example.comEl archivo all_headers.txt contenerá bloques de encabezado de cada redireccionamiento, separados por líneas en blanco. También puedes establecer --max-redirs 5 para limitar el número de saltos y evitar bucles infinitos.
Codificación de caracteres y compresión
Muchos servidores comprimen las respuestas con gzip o Brotli, lo que puede hacer que el cuerpo sin procesar parezca basura. El --compressed indicador le indica a cURL que envíe el encabezado adecuado Accept-Encoding y descomprimir automáticamente la respuesta:
curl --compressed -i https://example.comEsto no cambia los encabezados en sí, pero garantiza que puedas leer el cuerpo junto con ellos. Si solo estás inspeccionando los encabezados, la compresión no es un problema, pero sí importa cuando combinas -i para ver ambos.
Puntos clave
- Utiliza
-ipara comprobaciones visuales rápidas que muestran los encabezados de respuesta junto con el cuerpo, y-Icuando solo necesites los encabezados de una solicitud HEAD. - El
-s -o /dev/null -D -patrón es esencial cuando las respuestas HEAD difieren de las GET: te proporciona los encabezados GET reales sin el ruido del cuerpo. - El modo detallado (
-v) es la herramienta más completa de tu arsenal, ya que muestra los encabezados de solicitud, los encabezados de respuesta y los detalles de TLS de una sola vez. - Variables de salida de cURL 7.83+ (
%header{name}y%{header_json}) eliminan la necesidad de canalizaciones grep/awk y se integran perfectamente con flujos de trabajo basados en JSON. - Combina
-Lcon-Dpara capturar los encabezados de cada salto de redireccionamiento, y comprueba siempre tu versión de cURL antes de confiar en las funciones más recientes.
Preguntas frecuentes
¿Cuál es la diferencia entre curl -i y curl -I?
curl -i envía una solicitud GET estándar e incluye los encabezados de respuesta por encima del cuerpo en la salida. curl -I envía una solicitud HEAD, que devuelve solo los encabezados sin ningún cuerpo. La opción en minúsculas -i te da la respuesta completa; la mayúscula -I es más rápido, pero puede devolver encabezados diferentes a los de una solicitud GET real en algunos servidores.
¿Cómo puedo mostrar los encabezados de respuesta de cURL como JSON?
Utiliza la -w '%{header_json}' variable write-out, disponible en cURL 7.83 y versiones posteriores. Ejecuta curl -s -o /dev/null -w '%{header_json}' <URL> para obtener un objeto JSON válido que contenga todos los encabezados. Canaliza el resultado a jq para formatear el texto o extraer campos. Los encabezados duplicados se agrupan automáticamente en matrices JSON.
¿Cómo puedo ver los encabezados de respuesta en PowerShell usando curl?
En Windows, curl en PowerShell es un alias de Invoke-WebRequest. Ejecuta (Invoke-WebRequest -Uri "https://example.com" -Method Head).Headers para ver una tabla hash de los encabezados de respuesta. Si quieres el binario real de cURL, ejecuta curl.exe -I https://example.com para omitir el alias y utilizar los mismos indicadores descritos en esta guía.
¿Cómo puedo ver los encabezados de cada redireccionamiento en una cadena con cURL?
Combina -L (seguir redireccionamientos) con -D (volcar encabezados) de esta manera: curl -L -D headers.txt -o /dev/null https://example.com. El archivo resultante contendrá bloques de encabezados separados para cada salto de redireccionamiento, delimitados por líneas en blanco. También puedes usar curl -Lv para ver los encabezados de cada salto en tiempo real en stderr.
Conclusión
Inspeccionar los encabezados de respuesta HTTP en cURL es una de esas habilidades que vale la pena dominar, ya que te resultará útil a diario una vez que la domines. Para comprobaciones rápidas, -i y -I te permiten hacerlo con un solo comando. Cuando necesites una visibilidad más detallada, -v muestra la transacción completa y -D te permite registrar los encabezados en archivos para su posterior análisis. Y si estás creando flujos automatizados, las nuevas -w variables de salida (disponibles en cURL 7.83+) te permiten extraer los encabezados como JSON limpio sin necesidad de complicados procesos de procesamiento de texto.
La clave está en elegir la opción adecuada para cada tarea. Utiliza la tabla de referencia rápida de esta guía como chuleta y aprovecha las recetas de scripts para convertir comandos puntuales en comprobaciones repetibles.
Si tus scripts de cURL se topan con protecciones antibots, CAPTCHAs o bloqueos de IP antes incluso de que puedas inspeccionar los encabezados, WebScrapingAPI puede gestionar la capa de solicitudes por ti, gestionando la rotación de proxies y la evitación de bloqueos detrás de un único punto final de API para que puedas centrarte en los datos en lugar de en la infraestructura.




