ERR_HTTP2_PROTOCOL_ERROR: qué significa y cómo solucionarlo

Punto clave

ERR_HTTP2_PROTOCOL_ERROR (error -337 de Chromium) significa que el flujo HTTP/2 que lleva la página falló. O bien el servidor, el proxy o la CDN lo reiniciaron a mitad de camino (Chrome informa de cualquier reinicio así como -337), o bien Chrome rechazó cabeceras que incumplen las reglas de HTTP/2. Como visitante, recargar, abrir una ventana de incógnito, borrar las cookies del sitio o pausar el análisis HTTPS del antivirus a veces lo resuelve, pero normalmente solo puede arreglarlo el propio sitio. Para los dueños del sitio, las causas habituales son una respuesta que el servidor o el proxy no pudo terminar (disco lleno, carpeta temporal sin permiso de escritura, una aplicación que falla), un Content-Length que no coincide con el cuerpo o una cabecera prohibida como Transfer-Encoding. Reprodúcelo con curl --http2 -v.

Compruébelo ahora

Página de error de Chrome con ERR_HTTP2_PROTOCOL_ERROR junto a las comprobaciones que corrigen los errores de protocolo HTTP/2
Página de error de Chrome con ERR_HTTP2_PROTOCOL_ERROR junto a las comprobaciones que corrigen los errores de protocolo HTTP/2
Empiece a leer
  1. ¿Qué es ERR_HTTP2_PROTOCOL_ERROR?
  2. Qué considera HTTP/2 una respuesta mal formada
  3. ¿Qué causa ERR_HTTP2_PROTOCOL_ERROR?
  4. Solución 1: haz una recarga forzada y prueba en modo incógnito
  5. Solución 2: borra las cookies y los archivos en caché de ese sitio
  6. Solución 3: pausa el análisis HTTPS del antivirus y las extensiones
  7. Solución 4: actualiza Chrome y prueba otros navegadores
  8. Solución 5: prueba la página sin HTTP/2
  9. Para propietarios de sitios web: cómo corregir los errores de protocolo HTTP/2
  10. 1. Reprodúcelo con curl
  11. 2. Busca respuestas cortadas a mitad de envío
  12. 3. Corrige Content-Length y las cabeceras prohibidas
  13. ERR_HTTP2_PROTOCOL_ERROR frente a errores similares
  14. Preguntas frecuentes

¿Qué es ERR_HTTP2_PROTOCOL_ERROR?

ERR_HTTP2_PROTOCOL_ERROR es un error de Chrome y Edge que significa que el flujo HTTP/2 que lleva la página falló: el servidor lo reinició antes de terminar o envió cabeceras que el navegador rechaza. En Chromium es el error de red -337: «There is an HTTP/2 protocol error» (net_error_list.h). Chrome no tiene una página de error propia para este caso, así que ves la genérica: «No se puede acceder a este sitio», con un aviso de que la página web puede estar temporalmente inactiva o haberse trasladado de forma permanente a otra dirección web, y ERR_HTTP2_PROTOCOL_ERROR debajo. Edge muestra el mismo código en su propia pantalla de error.

HTTP/2 es la versión más rápida de HTTP que usan hoy la mayoría de los sitios HTTPS. Cada petición viaja en su propio flujo dentro de una única conexión, y cualquiera de las dos partes puede cancelar un flujo con un reinicio. Chrome informa de cualquier reinicio del servidor como un error de protocolo, sea cual sea el motivo del servidor, y además cancela un flujo por su cuenta cuando las cabeceras rompen las reglas de HTTP/2 (una cabecera Transfer-Encoding, mayúsculas en el nombre de una cabecera, un estado ausente).

Los desarrolladores suelen verlo en la consola de DevTools como net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK). Esa combinación es una pista clara: las cabeceras eran válidas y el servidor respondió 200, pero el flujo falló mientras llegaba el cuerpo.

Mira las cabeceras que una página envía de verdad

Qué considera HTTP/2 una respuesta mal formada

El estándar HTTP/2 (RFC 9113) enumera los errores que hacen que una respuesta esté mal formada. Son los problemas que hay detrás de la mayoría de los errores reales, y así llega cada uno al navegador:

ReglaQué la incumple
Content-Length debe ser igual al tamaño del cuerpoUn servidor o plugin declara un tamaño y envía otro; el proxy, la CDN o el servidor que está delante reinicia entonces el flujo
La respuesta debe terminar limpiamenteEl servidor, el proxy o la aplicación no puede terminarla (disco lleno, caída, tiempo de espera agotado) y reinicia el flujo; nginx lo hace cuando no puede completar una respuesta que ya empezó
Sin cabeceras propias de la conexiónTransfer-Encoding en una respuesta HTTP/2 (Chrome la rechaza); Connection, Keep-Alive, Proxy-Connection y Upgrade también están prohibidas, y clientes estrictos como curl las rechazan
Los nombres de campo deben ir en minúsculasNombres de cabecera con mayúsculas que pasan tal cual a HTTP/2
Valores de cabecera válidosSaltos de línea u otros caracteres prohibidos dentro del valor de una cabecera
Una pseudocabecera :status válidaUn código de estado ausente o ilegible

¿Qué causa ERR_HTTP2_PROTOCOL_ERROR?

La mayoría de los casos vienen del lado del servidor, pero algunas cosas de tu propio equipo pueden dañar una respuesta mientras llega:

  • En el servidor: una respuesta que el servidor o el proxy no puede terminar (un proxy que se queda sin espacio en disco o no puede escribir sus archivos temporales, una aplicación que falla mientras transmite, un tiempo de espera agotado), valores de Content-Length incorrectos que hacen que el proxy de delante se rinda, cabeceras prohibidas o no válidas y un soporte de HTTP/2 defectuoso en un servidor o una configuración de CDN antiguos.
  • Por tu parte: antivirus o cortafuegos que inspecciona el HTTPS y reescribe el tráfico, extensiones del navegador que modifican peticiones o respuestas, una petición que el servidor procesa mal (por ejemplo, cookies demasiado grandes) y, de vez en cuando, una versión de Chrome obsoleta.

Solución 1: haz una recarga forzada y prueba en modo incógnito

Pulsa Ctrl + Shift + R (Mac: Cmd + Shift + R) para recargar sin la caché. Una respuesta que se cortó una vez puede llegar bien en el siguiente intento.

Después abre la página en una ventana de incógnito (Ctrl + Shift + N; en Mac, Cmd + Shift + N). El modo incógnito no tiene cookies ni la caché de tu perfil normal, y las extensiones están desactivadas por defecto. Si la página carga ahí, la solución 2 o la 3 lo resolverán en tu ventana normal.

Solución 2: borra las cookies y los archivos en caché de ese sitio

Borrar las cookies y los archivos en caché del sitio cambia la petición que envía Chrome (menos cookies y ninguna copia en caché que revalidar), lo que puede evitar un fallo del servidor. Haz clic en Ver información del sitio, a la izquierda de la barra de direcciones → Cookies y datos de sitios → Gestionar los datos de sitios en el dispositivo → elimina y recarga. Para una limpieza más amplia, pulsa Ctrl + Shift + Supr y borra Archivos e imágenes en caché de los Últimos 7 días.

Solución 3: pausa el análisis HTTPS del antivirus y las extensiones

El software de seguridad que descifra e inspecciona el tráfico HTTPS se coloca en medio de cada conexión HTTP/2. Si su gestión de HTTP/2 tiene errores o está desactualizada, puede romper flujos o dejar pasar cabeceras que Chrome rechaza. Desactiva solo la función que analiza el HTTPS (Avast/AVG: Escudo web → Enable HTTPS scanning; ESET: Filtrado del protocolo SSL/TLS; Kaspersky: Analizar conexiones cifradas) y recarga. Si eso lo soluciona, actualiza el antivirus y añade una exclusión para el sitio.

Después, desactiva todas las extensiones en chrome://extensions, recarga y vuelve a activarlas una por una. Los bloqueadores de anuncios, las herramientas de privacidad y cualquier cosa que edite cabeceras son los sospechosos habituales.

Solución 4: actualiza Chrome y prueba otros navegadores

Abre chrome://settings/help para instalar cualquier actualización pendiente y reinicia el navegador. Luego abre la misma página en Firefox o Safari, y en otro dispositivo o red. Si falla en todas partes, el sitio está roto y solo su dueño puede arreglarlo (el análisis HTTPS del antivirus afecta a todos los navegadores de un mismo ordenador, así que un segundo dispositivo es la prueba real). Si solo fallan Chrome o Edge, lo probable es que el sitio envíe una cabecera que Chrome rechaza; aun así, vale la pena repetir las soluciones 2 y 3.

Solución 5: prueba la página sin HTTP/2

Chrome puede iniciarse con HTTP/2 (y HTTP/3) desactivados, lo que muestra si HTTP/2 interviene. Inicia desde una terminal un segundo Chrome, independiente; la carpeta de perfil adicional lo convierte en una instancia nueva aunque tu Chrome habitual esté abierto:

bash
# Windows (Command Prompt)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="%TEMP%\h2test" --disable-http2 --disable-quic

# macOS (Terminal)
open -na "Google Chrome" --args --user-data-dir=/tmp/h2test --disable-http2 --disable-quic

Si la página carga en esa ventana, sus respuestas HTTP/2 son el problema y el dueño tiene que arreglarlas. Si ahora falla con ERR_CONTENT_LENGTH_MISMATCH o ERR_INCOMPLETE_CHUNKED_ENCODING, el servidor corta la respuesta sea cual sea el protocolo. Cierra esa ventana al terminar; tu Chrome habitual no se ve afectado.

Para propietarios de sitios web: cómo corregir los errores de protocolo HTTP/2

Si visitantes de distintas redes y navegadores informan del error, el problema está en tu infraestructura. Estas tres comprobaciones encuentran casi todos los casos.

1. Reprodúcelo con curl

bash
# HTTP/2: watch the end of the output
curl -sv --http2 https://example.com/broken-page -o /dev/null
# A stream the server gave up on ends with something like:
# HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)
# (curl 8.19+: HTTP/2 stream 1 reset by server (error 0x2 INTERNAL_ERROR);
#  "reset by curl" means curl rejected the response itself)

# Same URL over HTTP/1.1 for comparison
curl -sv --http1.1 https://example.com/broken-page -o /dev/null

Si HTTP/1.1 funciona y HTTP/2 falla, HTTP/2 interviene. «Reset by server» apunta a que el servidor o un proxy se rindió a mitad de la respuesta. curl no comprueba exactamente lo mismo que Chrome (rechaza discrepancias de Content-Length y cabeceras de conexión que Chrome deja pasar), así que tómalo como una pista sólida, no como una prueba. El verificador de cabeceras HTTP lista las cabeceras que define tu aplicación, vistas desde fuera de tu red.

2. Busca respuestas cortadas a mitad de envío

La causa más frecuente en el servidor es una respuesta que empieza (estado 200, cabeceras enviadas) y luego no se puede terminar. nginx guarda en búfer las respuestas más grandes de tu aplicación en archivos temporales; si el disco está lleno o nginx no puede escribir en su carpeta temporal, reinicia el flujo y el navegador informa de un error de protocolo. Comprueba:

bash
df -h                                   # is any disk full?
sudo grep -E "No space left|Permission denied" /var/log/nginx/error.log | tail
ls -ld /var/lib/nginx/proxy /var/lib/nginx/fastcgi   # Debian/Ubuntu packages
ls -ld /var/cache/nginx/proxy_temp /var/cache/nginx/fastcgi_temp   # nginx.org packages
# the temp folders must be writable by the nginx worker user

Revisa también la propia aplicación: un proceso de PHP o Node que se bloquea, agota el tiempo de espera o alcanza un límite de memoria mientras envía una página grande o una descarga produce el mismo resultado. Los logs de la aplicación en torno a la hora del error suelen mostrarlo.

3. Corrige Content-Length y las cabeceras prohibidas

  • Content-Length: deja que lo calcule el servidor. No lo fijes a mano en el código de la aplicación si un plugin, un middleware o el servidor web también comprime o modifica la salida, porque entonces la longitud declarada ya no coincide con los bytes enviados. Una longitud fijada en código PHP mientras un plugin o un ajuste de PHP también comprime la salida es una de las formas en que esto ocurre en sitios WordPress.
  • Transfer-Encoding: no la envíes nunca en una respuesta HTTP/2; Chrome reinicia el flujo en cuanto ve una. La RFC 9113 también prohíbe Connection, Keep-Alive, Proxy-Connection y Upgrade. Chrome las ignora, pero curl y otros clientes estrictos las rechazan, y nginx elimina la mayoría de ellas de las respuestas con proxy por ti.
  • Valores de cabecera: asegúrate de que ninguna cabecera contenga un salto de línea ni un carácter de control. Suele venir de datos del usuario que acaban en una cabecera, como un nombre de archivo en Content-Disposition.
  • CDN por delante: si usas Cloudflare u otra CDN, prueba el origen directamente (con curl --resolve o una entrada en hosts) para saber si el error viene del origen o de la CDN.

ERR_HTTP2_PROTOCOL_ERROR frente a errores similares

ErrorCódigoQué pasó
ERR_HTTP2_PROTOCOL_ERROR-337Una respuesta HTTP/2 rompió las reglas del protocolo
ERR_QUIC_PROTOCOL_ERROR-356El mismo tipo de fallo sobre HTTP/3 (QUIC)
ERR_SSL_PROTOCOL_ERROR-107El handshake HTTPS (TLS) falló antes de que empezara HTTP/2
ERR_CONNECTION_CLOSED-100La conexión se cerró antes de que llegara la página
ERR_EMPTY_RESPONSE-324El servidor no envió absolutamente nada

Guías detalladas: ERR_QUIC_PROTOCOL_ERROR, ERR_SSL_PROTOCOL_ERROR, ERR_CONNECTION_CLOSED y ERR_EMPTY_RESPONSE. Para revisar desde fuera el certificado y la configuración HTTPS de un sitio, usa el Verificador de Certificado SSL.

Mira las cabeceras que tu sitio envía de verdad

El verificador de cabeceras HTTP de DNS Robot descarga cualquier URL por HTTP/1.1 desde nuestros servidores y lista el código de estado y cada cabecera de respuesta que define tu aplicación (Content-Length, Content-Encoding, Content-Disposition), para que puedas compararlas con lo que muestra curl --http2.

Fuentes

  1. net_error_list.h (HTTP2_PROTOCOL_ERROR -337), Chromium
  2. RFC 9113: HTTP/2, mensajes mal formados, IETF
  3. HTTP/2: ERR_HTTP2_PROTOCOL_ERROR, Cloudflare

Preguntas frecuentes

¿Qué significa ERR_HTTP2_PROTOCOL_ERROR?

Significa que el flujo HTTP/2 que lleva la página falló. Normalmente el servidor, un proxy o la CDN lo reinició antes de que terminara la respuesta, y Chrome lo informa como un error de protocolo; a veces Chrome rechazó cabeceras que HTTP/2 prohíbe, como Transfer-Encoding. En Chromium es el error de red -337.

¿ERR_HTTP2_PROTOCOL_ERROR es culpa mía o del sitio web?

Normalmente es del sitio web. El análisis HTTPS del antivirus, las extensiones del navegador o las cookies demasiado grandes también pueden provocarlo, así que prueba primero una recarga forzada, una ventana de incógnito y pausar el análisis HTTPS. Si falla en todos los navegadores y en todas las redes, solo puede arreglarlo el dueño del sitio.

¿Qué significa net::ERR_HTTP2_PROTOCOL_ERROR 200?

Las cabeceras eran válidas y el servidor respondió 200, pero el flujo falló mientras llegaba el cuerpo: el servidor, el proxy o la CDN lo reinició a mitad de camino. Las causas habituales son un proxy que se quedó sin espacio en disco o no pudo escribir archivos temporales, una aplicación que falló a mitad de la respuesta o un Content-Length que no coincide con el cuerpo.

¿Cómo soluciono ERR_HTTP2_PROTOCOL_ERROR en Chrome?

Haz una recarga forzada con Ctrl + Shift + R, prueba el modo incógnito, borra las cookies y los archivos en caché del sitio, pausa el análisis HTTPS del antivirus, desactiva las extensiones y actualiza Chrome. Para comprobar si interviene HTTP/2, inicia un Chrome independiente con --user-data-dir, --disable-http2 y --disable-quic y mira si la página carga.

¿Puedo desactivar HTTP/2 en Chrome?

No desde la página de configuración. Para probar, inicia un Chrome independiente con --disable-http2 y --disable-quic (más --user-data-dir, o un Chrome que ya esté abierto ignorará las opciones). Solo vale para ese inicio. Es un diagnóstico, no una solución a largo plazo, porque HTTP/2 hace los sitios más rápidos.

¿Por qué aparece ERR_HTTP2_PROTOCOL_ERROR en mi sitio con nginx?

Comprueba si el disco está lleno o nginx no puede escribir en sus carpetas temporales de proxy o FastCGI (busca «No space left on device» o «Permission denied» en el registro de errores), si la aplicación falla a mitad de la respuesta y si tu aplicación envía una cabecera Transfer-Encoding o un Content-Length incorrecto. Reprodúcelo con curl --http2 -v.

¿Cloudflare puede causar ERR_HTTP2_PROTOCOL_ERROR?

Normalmente el culpable es el origen. La documentación de Cloudflare cita las cabeceras de origen mal formadas y los problemas de compresión (un cuerpo gzip cuyo Content-Length no se actualizó, o gzip dañado) como causas habituales, y puede que solo aparezcan cuando el tráfico pasa por Cloudflare. Prueba el origen directamente, sin pasar por Cloudflare.

¿Qué diferencia hay entre ERR_HTTP2_PROTOCOL_ERROR y ERR_QUIC_PROTOCOL_ERROR?

Son el mismo tipo de fallo en protocolos distintos. ERR_HTTP2_PROTOCOL_ERROR ocurre sobre HTTP/2 (sobre TCP) y ERR_QUIC_PROTOCOL_ERROR sobre HTTP/3 (sobre QUIC). Los firewalls y antivirus que interfieren con QUIC son una causa adicional habitual del segundo.

¿Borrar la caché soluciona ERR_HTTP2_PROTOCOL_ERROR?

A veces. Borrar las cookies y los archivos en caché del sitio cambia la petición que envía Chrome, lo que puede evitar un fallo del servidor, así que vale la pena probarlo. Si el servidor sigue reiniciando el flujo o enviando cabeceras incorrectas, el error vuelve hasta que se arregle el sitio.

Sobre el autor

Shaik Vahid

Fundador de DNS Robot. Vahid pasó años en el soporte de alojamiento web resolviendo dominios, registros DNS, certificados SSL y la entrega de correo para clientes. Desarrolla las herramientas de DNS Robot y escribe estas guías a partir de los errores que la gente encuentra de verdad.

Verificador de encabezados HTTP

Analiza cabeceras de respuesta HTTP y clasificación de cabeceras de seguridad