ERR_HTTP2_PROTOCOL_ERROR: o que é e como resolver

Ponto-chave

ERR_HTTP2_PROTOCOL_ERROR (erro -337 do Chromium) significa que o fluxo HTTP/2 que carrega a página falhou. Ou o servidor, o proxy ou a CDN o reiniciou no meio do caminho (o Chrome reporta qualquer reinício assim como -337), ou o Chrome rejeitou cabeçalhos que quebram as regras do HTTP/2. Para visitantes, recarregar, abrir uma janela anônima, limpar os cookies do site ou pausar a verificação HTTPS do antivírus às vezes resolve, mas em geral só o próprio site consegue corrigir. Para donos de sites, as causas mais comuns são uma resposta que o servidor ou o proxy não conseguiu terminar (disco cheio, pasta temporária sem permissão de escrita, aplicação travando), um Content-Length que não bate com o corpo ou um cabeçalho proibido como Transfer-Encoding. Reproduza o erro com curl --http2 -v.

Verifique agora

Página de erro do Chrome com ERR_HTTP2_PROTOCOL_ERROR ao lado das verificações que corrigem erros de protocolo HTTP/2
Página de erro do Chrome com ERR_HTTP2_PROTOCOL_ERROR ao lado das verificações que corrigem erros de protocolo HTTP/2
Comece a ler
  1. O que é o ERR_HTTP2_PROTOCOL_ERROR?
  2. O que o HTTP/2 considera malformado
  3. O que causa o ERR_HTTP2_PROTOCOL_ERROR?
  4. Correção 1: recarregue sem cache e teste uma janela anônima
  5. Correção 2: limpe os cookies e os arquivos em cache desse site
  6. Correção 3: pause a verificação HTTPS do antivírus e as extensões
  7. Correção 4: atualize o Chrome e teste outros navegadores
  8. Correção 5: teste a página sem HTTP/2
  9. Para donos de sites: como corrigir erros de protocolo HTTP/2
  10. 1. Reproduza o erro com o curl
  11. 2. Procure respostas cortadas no meio do stream
  12. 3. Corrija o Content-Length e os cabeçalhos proibidos
  13. ERR_HTTP2_PROTOCOL_ERROR vs. erros parecidos
  14. Perguntas Frequentes

O que é o ERR_HTTP2_PROTOCOL_ERROR?

O ERR_HTTP2_PROTOCOL_ERROR é um erro do Chrome e do Edge que significa que o fluxo HTTP/2 que carrega a página falhou: o servidor o reiniciou antes de terminar ou enviou cabeçalhos que o navegador rejeita. No Chromium, é o erro de rede -337: “There is an HTTP/2 protocol error” (net_error_list.h). O Chrome não tem uma página de erro própria para ele, então você vê a genérica: “Não é possível acessar esse site. A página da Web em … pode estar temporariamente indisponível ou pode ter sido movida permanentemente para um novo endereço da Web”, com ERR_HTTP2_PROTOCOL_ERROR embaixo. O Edge mostra o mesmo código na própria tela de erro.

O HTTP/2 é a versão mais rápida do HTTP que a maioria dos sites HTTPS usa hoje. Cada requisição viaja em seu próprio fluxo dentro de uma única conexão, e qualquer um dos lados pode cancelar um fluxo com um reinício. O Chrome reporta qualquer reinício vindo do servidor como erro de protocolo, seja qual for o motivo do servidor, e também cancela um fluxo por conta própria quando os cabeçalhos quebram as regras do HTTP/2 (um cabeçalho Transfer-Encoding, letras maiúsculas no nome de um cabeçalho, um status ausente).

Desenvolvedores costumam ver o erro no console do DevTools como net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK). Essa combinação é uma pista forte: os cabeçalhos eram válidos e o servidor respondeu 200, mas o fluxo falhou enquanto o corpo chegava.

Veja os cabeçalhos que uma página realmente envia

O que o HTTP/2 considera malformado

O padrão HTTP/2 (RFC 9113) lista os erros que tornam uma resposta malformada. São os problemas por trás da maioria dos erros reais, e é assim que cada um chega ao navegador:

RegraO que a quebra
Content-Length deve ser igual ao tamanho do corpoUm servidor ou plugin declara um tamanho e envia outro; o proxy, a CDN ou o servidor à frente então reinicia o fluxo
A resposta deve terminar de forma limpaO servidor, o proxy ou a aplicação não consegue terminá-la (disco cheio, travamento, timeout) e reinicia o fluxo; o nginx faz isso quando não consegue completar uma resposta que já começou
Sem cabeçalhos específicos da conexãoTransfer-Encoding em uma resposta HTTP/2 (o Chrome a rejeita); Connection, Keep-Alive, Proxy-Connection e Upgrade também são proibidos, e clientes estritos como o curl os rejeitam
Nomes de campo devem ser minúsculosNomes de cabeçalho com letras maiúsculas repassados direto para o HTTP/2
Valores de cabeçalho válidosQuebras de linha ou outros caracteres proibidos dentro de um valor de cabeçalho
Um pseudocabeçalho :status válidoUm código de status ausente ou ilegível

O que causa o ERR_HTTP2_PROTOCOL_ERROR?

A maioria dos casos vem do lado do servidor, mas algumas coisas no seu próprio computador podem danificar uma resposta no caminho:

  • No servidor: uma resposta que o servidor ou o proxy não consegue terminar (um proxy que fica sem espaço em disco ou não consegue gravar seus arquivos temporários, uma aplicação que trava durante o streaming, um timeout), valores de Content-Length errados que fazem o proxy à frente desistir, cabeçalhos proibidos ou inválidos e suporte a HTTP/2 com bugs em um servidor ou configuração de CDN mais antigos.
  • No seu lado: antivírus ou firewall que inspeciona o HTTPS e reescreve o tráfego, extensões do navegador que modificam requisições ou respostas, uma requisição que o servidor trata mal (por exemplo, cookies grandes demais) e, ocasionalmente, uma versão desatualizada do Chrome.

Correção 1: recarregue sem cache e teste uma janela anônima

Pressione Ctrl + Shift + R (Mac: Cmd + Shift + R) para recarregar sem o cache. Uma resposta que foi cortada uma vez pode chegar inteira na próxima tentativa.

Depois, abra a página em uma janela anônima (Ctrl + Shift + N, no Mac Cmd + Shift + N). A janela anônima não tem cookies nem o cache do seu perfil normal, e as extensões ficam desativadas por padrão. Se a página carregar ali, a Correção 2 ou a Correção 3 vai resolver o problema na sua janela normal.

Correção 2: limpe os cookies e os arquivos em cache desse site

Limpar os cookies e os arquivos em cache do site muda a requisição que o Chrome envia (menos cookies, nenhuma cópia em cache para revalidar), o que pode evitar um bug do servidor. Clique em Ver informações do site, à esquerda da barra de endereço → Cookies e dados de sites → Gerenciar dados de sites no dispositivo → exclua e recarregue. Para uma limpeza mais ampla, pressione Ctrl + Shift + Delete e limpe Imagens e arquivos em cache dos Últimos sete dias.

Correção 3: pause a verificação HTTPS do antivírus e as extensões

Software de segurança que descriptografa e inspeciona o HTTPS fica no meio de toda conexão HTTP/2. Se o tratamento de HTTP/2 dele tem bugs ou está desatualizado, ele pode quebrar fluxos ou repassar cabeçalhos que o Chrome rejeita. Desative só o recurso de verificação HTTPS (Avast/AVG: Web Shield → Enable HTTPS scanning; ESET: SSL/TLS protocol filtering; Kaspersky: Scan encrypted connections; nas versões em português, algo como “verificação de HTTPS”) e recarregue. Se isso resolver, atualize o antivírus e adicione uma exclusão para o site.

Depois, desative todas as extensões em chrome://extensions, recarregue e reative uma por vez. Bloqueadores de anúncios, ferramentas de privacidade e qualquer coisa que edite cabeçalhos são os suspeitos de sempre.

Correção 4: atualize o Chrome e teste outros navegadores

Abra chrome://settings/help para instalar qualquer atualização pendente e reinicie o navegador. Depois abra a mesma página no Firefox ou no Safari, e em outro dispositivo ou rede. Se falhar em todos, o site está quebrado e só o dono pode corrigir (a verificação HTTPS do antivírus afeta todos os navegadores de um computador, então um segundo dispositivo é o teste de verdade). Se só o Chrome ou o Edge falham, o site provavelmente envia um cabeçalho que o Chrome rejeita; vale repetir as correções 2 e 3 mesmo assim.

Correção 5: teste a página sem HTTP/2

O Chrome pode ser iniciado com HTTP/2 (e HTTP/3) desligados, o que mostra se o HTTP/2 está envolvido. Inicie um segundo Chrome, separado, a partir de um terminal; a pasta de perfil extra o transforma em uma nova instância mesmo com o seu Chrome normal aberto:

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

Se a página carregar nessa janela, as respostas HTTP/2 dela são o problema e o dono precisa corrigi-las. Se agora ela falhar com ERR_CONTENT_LENGTH_MISMATCH ou ERR_INCOMPLETE_CHUNKED_ENCODING, o servidor está cortando a resposta seja qual for o protocolo. Feche essa janela quando terminar; o seu Chrome normal não é afetado.

Para donos de sites: como corrigir erros de protocolo HTTP/2

Se visitantes em redes e navegadores diferentes relatam o erro, o problema está na sua infraestrutura. Estas três verificações encontram quase todos os casos.

1. Reproduza o erro com o 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

Se o HTTP/1.1 funciona e o HTTP/2 falha, o HTTP/2 está envolvido. “Reset by server” aponta para o servidor ou um proxy desistindo no meio da resposta. O curl não verifica exatamente o que o Chrome verifica (ele rejeita divergências de Content-Length e cabeçalhos de conexão que o Chrome deixa passar), então encare como uma pista forte, não como prova. O verificador de cabeçalhos HTTP lista os cabeçalhos que a sua aplicação define, vistos de fora da sua rede.

2. Procure respostas cortadas no meio do stream

A causa mais comum no servidor é uma resposta que começa (status 200, cabeçalhos enviados) e depois não consegue ser terminada. O nginx armazena em buffer as respostas maiores da sua aplicação em arquivos temporários; se o disco estiver cheio ou o nginx não conseguir gravar na pasta temporária, ele reinicia o fluxo e o navegador reporta um erro de protocolo. Verifique:

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

Verifique também o próprio app: um processo PHP ou Node que trava, estoura o tempo limite ou atinge um limite de memória enquanto envia uma página grande ou um download produz o mesmo resultado. Os logs do app perto do horário do erro normalmente mostram isso.

3. Corrija o Content-Length e os cabeçalhos proibidos

  • Content-Length: deixe o servidor calculá-lo. Não o defina à mão no código da aplicação se um plugin, um middleware ou o servidor web também comprime ou modifica a saída, porque aí o tamanho declarado deixa de bater com os bytes enviados. Um tamanho definido no código PHP enquanto um plugin ou uma configuração do PHP também comprime a saída é uma das formas como isso acontece em sites WordPress.
  • Transfer-Encoding: nunca o envie em uma resposta HTTP/2; o Chrome reinicia o fluxo assim que vê um. A RFC 9113 também proíbe Connection, Keep-Alive, Proxy-Connection e Upgrade. O Chrome os ignora, mas o curl e outros clientes estritos os rejeitam, e o nginx remove a maioria deles das respostas via proxy para você.
  • Valores de cabeçalho: garanta que nenhum cabeçalho contenha quebra de linha ou caractere de controle. Isso costuma vir de dados do usuário colocados em um cabeçalho, como um nome de arquivo em Content-Disposition.
  • CDN à frente: se você usa Cloudflare ou outra CDN, teste a origem diretamente (com curl --resolve ou uma entrada no hosts) para saber se o erro vem da origem ou da CDN.

ERR_HTTP2_PROTOCOL_ERROR vs. erros parecidos

ErroCódigoO que aconteceu
ERR_HTTP2_PROTOCOL_ERROR-337Uma resposta HTTP/2 quebrou as regras do protocolo
ERR_QUIC_PROTOCOL_ERROR-356O mesmo tipo de falha via HTTP/3 (QUIC)
ERR_SSL_PROTOCOL_ERROR-107O handshake HTTPS (TLS) falhou antes de o HTTP/2 começar
ERR_CONNECTION_CLOSED-100A conexão foi fechada antes de uma página chegar
ERR_EMPTY_RESPONSE-324O servidor não enviou nada

Guias detalhados: ERR_QUIC_PROTOCOL_ERROR, ERR_SSL_PROTOCOL_ERROR, ERR_CONNECTION_CLOSED e ERR_EMPTY_RESPONSE. Para verificar o certificado e a configuração HTTPS de um site de fora, use o Verificador de SSL.

Veja os cabeçalhos que o seu site realmente envia

O verificador de cabeçalhos HTTP do DNS Robot busca qualquer URL por HTTP/1.1 a partir dos nossos servidores e lista o código de status e cada cabeçalho de resposta que a sua aplicação define (Content-Length, Content-Encoding, Content-Disposition), para você compará-los com o que o curl --http2 mostra.

Fontes

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

Perguntas Frequentes

O que significa ERR_HTTP2_PROTOCOL_ERROR?

Significa que o fluxo HTTP/2 que carrega a página falhou. Normalmente o servidor, um proxy ou a CDN o reiniciou antes de a resposta terminar, e o Chrome reporta isso como erro de protocolo; às vezes o Chrome rejeitou cabeçalhos que o HTTP/2 proíbe, como Transfer-Encoding. No Chromium, é o erro de rede -337.

O ERR_HTTP2_PROTOCOL_ERROR é culpa minha ou do site?

Em geral, do site. A verificação HTTPS do antivírus, extensões do navegador ou cookies grandes demais também podem causá-lo, então tente primeiro um recarregamento forçado, uma janela anônima e pausar a verificação HTTPS. Se falhar em todos os navegadores e em todas as redes, só o dono do site pode corrigir.

O que significa net::ERR_HTTP2_PROTOCOL_ERROR 200?

Os cabeçalhos eram válidos e o servidor respondeu 200, mas o fluxo falhou enquanto o corpo chegava: o servidor, o proxy ou a CDN o reiniciou no meio do caminho. As causas comuns são um proxy que ficou sem espaço em disco ou não conseguiu gravar arquivos temporários, uma aplicação que travou no meio da resposta ou um Content-Length que não bate com o corpo.

Como corrigir ERR_HTTP2_PROTOCOL_ERROR no Chrome?

Faça um recarregamento forçado com Ctrl + Shift + R, tente o modo anônimo, limpe os cookies e os arquivos em cache do site, pause a verificação HTTPS do antivírus, desative as extensões e atualize o Chrome. Para testar se o HTTP/2 está envolvido, inicie um Chrome separado com --user-data-dir, --disable-http2 e --disable-quic e veja se a página carrega.

Dá para desativar o HTTP/2 no Chrome?

Não pela página de configurações. Para testar, inicie um Chrome separado com --disable-http2 e --disable-quic (mais --user-data-dir, ou um Chrome já em execução ignora as opções). Vale só para essa inicialização. É um diagnóstico, não uma solução de longo prazo, porque o HTTP/2 deixa os sites mais rápidos.

Por que o ERR_HTTP2_PROTOCOL_ERROR acontece no meu site com nginx?

Verifique se o disco está cheio ou se o nginx não consegue gravar nas pastas temporárias de proxy ou FastCGI (procure “No space left on device” ou “Permission denied” no log de erros), se a aplicação trava no meio da resposta e se a sua aplicação envia um cabeçalho Transfer-Encoding ou um Content-Length errado. Reproduza o erro com curl --http2 -v.

A Cloudflare pode causar ERR_HTTP2_PROTOCOL_ERROR?

Em geral, a culpa é da origem. A documentação da Cloudflare cita cabeçalhos de origem malformados e problemas de compressão (um corpo gzip cujo Content-Length não foi atualizado, ou gzip corrompido) como causas comuns, e eles podem só aparecer quando o tráfego passa pela Cloudflare. Teste a origem diretamente, sem passar pela Cloudflare.

Qual é a diferença entre ERR_HTTP2_PROTOCOL_ERROR e ERR_QUIC_PROTOCOL_ERROR?

São o mesmo tipo de falha em protocolos diferentes. O ERR_HTTP2_PROTOCOL_ERROR acontece via HTTP/2 (sobre TCP), e o ERR_QUIC_PROTOCOL_ERROR via HTTP/3 (sobre QUIC). Firewalls e antivírus que interferem no QUIC são uma causa extra comum do segundo.

Limpar o cache resolve o ERR_HTTP2_PROTOCOL_ERROR?

Às vezes. Limpar os cookies e os arquivos em cache do site muda a requisição que o Chrome envia, o que pode evitar um bug do servidor, então vale tentar. Se o servidor continuar reiniciando o fluxo ou enviando cabeçalhos ruins, o erro volta até o site ser corrigido.

Sobre o autor

Shaik Vahid

Fundador da DNS Robot. Vahid passou anos no suporte de hospedagem de sites resolvendo domínios, registros DNS, certificados SSL e entrega de e-mails para clientes. Ele cria as ferramentas da DNS Robot e escreve estes guias a partir dos erros que as pessoas realmente encontram.

Verificador de headers HTTP

Analise cabeçalhos de resposta HTTP e classificação de cabeçalhos de segurança