ERR_HTTP2_PROTOCOL_ERROR: o que é e como resolver

Advertisement
O que é o ERR_HTTP2_PROTOCOL_ERROR?
O ERR_HTTP2_PROTOCOL_ERROR é um erro do Chrome e do Edge que significa que o navegador recebeu uma resposta HTTP/2 que quebrou as regras do protocolo. No Chromium, é o erro de rede -337: "há um erro de protocolo HTTP/2". 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 HTTP/2 é a versão mais rápida do HTTP que a maioria dos sites HTTPS usa hoje. Ele é mais rígido que o HTTP/1.1: as respostas são divididas em frames binários, os cabeçalhos seguem regras precisas e o tamanho declarado de uma resposta precisa bater com o que realmente chega. Quando o Chrome vê uma resposta que quebra essas regras, por exemplo uma que para no meio do stream ou que tem um cabeçalho proibido, ele trata a resposta inteira como malformada e a descarta.
Desenvolvedores costumam ver o erro no console do DevTools como net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK). Essa combinação é uma pista forte: o servidor respondeu 200, mas o corpo da resposta nunca chegou inteiro.
O que o HTTP/2 considera malformado
O padrão HTTP/2 (RFC 9113) lista os erros que tornam uma resposta malformada, e um stream que recebe reset antes de terminar também falha. Estes são os problemas por trás da maioria dos erros na prática:
| Regra | O que a quebra |
|---|---|
| O Content-Length precisa ser igual ao tamanho do corpo | Um servidor ou plugin declara um tamanho e envia outro, por exemplo quando a saída é comprimida depois que o tamanho foi definido |
| A resposta precisa terminar de forma limpa | O servidor, o proxy ou o app para de enviar no meio do caminho |
| Nada de cabeçalhos específicos de conexão | Connection, Keep-Alive, Proxy-Connection, Transfer-Encoding ou Upgrade enviados em uma resposta HTTP/2 |
| Os nomes dos campos precisam estar em minúsculas | Nomes de cabeçalho com letras maiúsculas repassados direto para o HTTP/2 |
| Valores de cabeçalho válidos | Quebras de linha ou outros caracteres proibidos dentro do valor de um cabeçalho |
| Uma linha :status válida | Um código de status ausente ou ilegível |
Advertisement
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: respostas cortadas no meio do stream (um proxy que fica sem espaço em disco ou não consegue gravar os arquivos temporários, um app que trava durante o envio, um tempo limite), valores de Content-Length errados, cabeçalhos proibidos ou inválidos e suporte a HTTP/2 com bugs em configurações antigas de servidor ou de CDN.
Do seu lado: antivírus ou firewall que inspeciona o HTTPS e reescreve as respostas, extensões do navegador que modificam requisições ou respostas, uma cópia da página corrompida no cache e, de vez em quando, 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.
Advertisement
Correção 2: limpe o cache e os cookies desse site
Uma cópia corrompida em cache ou um cookie inchado pode disparar o erro repetidamente em um site. Limpe só os dados desse site: clique no ícone à esquerda da barra de endereço → Cookies e dados do site (ou Configurações do site) → exclua os dados e recarregue. Para uma limpeza mais ampla, pressione Ctrl + Shift + Delete e limpe Imagens e arquivos armazenados em cache dos últimos 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 repassar respostas que o Chrome considera malformadas. Desative só o recurso de verificação HTTPS (que costuma se chamar HTTPS scanning, Web Shield, SSL/TLS protocol filtering ou 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.
Em seguida, desative todas as extensões em chrome://extensions, recarregue e depois reative uma de cada vez. Bloqueadores de anúncios, ferramentas de privacidade e qualquer coisa que edite cabeçalhos são os suspeitos de sempre.
Advertisement
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. Se falhar em todos, o site está com defeito e só o dono pode corrigir. Se só o Chrome ou o Edge falham, normalmente o problema ainda é do site, porque o Chrome é o mais rigoroso ao rejeitar HTTP/2 malformado, mas vale repetir as Correções 2 e 3.
Correção 5: teste a página sem HTTP/2
O Chrome pode ser iniciado com o HTTP/2 desligado, o que mostra com certeza se o HTTP/2 é o problema. Feche todas as janelas do Chrome primeiro e depois inicie o navegador por um terminal:
# Windows (Prompt de Comando)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-http2
# macOS (Terminal)
open -a "Google Chrome" --args --disable-http2Se a página carregar nessa janela, as respostas HTTP/2 do site estão malformadas e o dono precisa corrigi-las. Depois, feche o Chrome e abra de novo normalmente. A flag vale só para essa inicialização.
Advertisement
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
# HTTP/2: observe o fim da saída
curl -sv --http2 https://example.com/broken-page -o /dev/null
# Um stream quebrado termina com algo como:
# HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
# (curl 8.19+: HTTP/2 stream 1 reset by server (error 0x1 PROTOCOL_ERROR))
# A mesma URL via HTTP/1.1, para comparar
curl -sv --http1.1 https://example.com/broken-page -o /dev/nullSe o HTTP/1.1 funciona e o HTTP/2 falha, o erro está confirmado. Compare os cabeçalhos de resposta das duas versões e anote quantos bytes chegam antes de o stream quebrar. O Verificador de Cabeçalhos HTTP também mostra os cabeçalhos que o seu site envia, vistos de fora da sua rede.
2. Procure respostas cortadas no meio do stream
A causa mais comum do lado do servidor é uma resposta que começa (status 200, cabeçalhos enviados) e depois para antes da hora. O nginx guarda as respostas maiores do seu app em arquivos temporários, e se o disco estiver cheio ou o nginx não conseguir gravar na pasta temporária, a resposta termina antes do fim e o navegador relata um erro de protocolo. Verifique:
df -h # algum disco está cheio?
sudo grep -E "No space left|Permission denied" /var/log/nginx/error.log | tail
ls -ld /var/lib/nginx/proxy /var/lib/nginx/fastcgi # pastas temporárias no Debian/Ubuntu; o dono deve ser o usuário do nginxVerifique 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 calcular. Não o defina na mão no código do app se um plugin, um middleware ou o servidor web também comprime ou modifica a saída, porque aí o tamanho declarado não bate mais 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 de isso acontecer em sites WordPress.
Cabeçalhos específicos de conexão: remova o código que define
Connection,Keep-Alive,Transfer-EncodingouUpgradenas respostas. O HTTP/2 os proíbe e, embora o nginx remova a maioria deles por você, alguns servidores de aplicação e proxies não removem.Valores de cabeçalho: garanta que nenhum cabeçalho contenha uma quebra de linha ou um caractere de controle. Isso muitas vezes vem de dados digitados pelo usuário colocados em um cabeçalho, como um nome de arquivo no
Content-Disposition.CDN na frente: se você usa a Cloudflare ou outra CDN, teste a origem diretamente (com o
--resolvedo curl ou uma entrada no arquivo hosts) para saber se o erro vem da origem ou da CDN.
ERR_HTTP2_PROTOCOL_ERROR vs. erros parecidos
| Erro | Código | O que aconteceu |
|---|---|---|
| ERR_HTTP2_PROTOCOL_ERROR | -337 | Uma resposta HTTP/2 quebrou as regras do protocolo |
| ERR_QUIC_PROTOCOL_ERROR | -356 | O mesmo tipo de falha via HTTP/3 (QUIC) |
| ERR_SSL_PROTOCOL_ERROR | -107 | O handshake HTTPS (TLS) falhou antes de o HTTP/2 começar |
| ERR_CONNECTION_CLOSED | -100 | A conexão foi fechada antes de uma página chegar |
| ERR_EMPTY_RESPONSE | -324 | O 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 a partir dos nossos servidores e lista o código de status e todos os cabeçalhos de resposta, o que facilita encontrar cabeçalhos proibidos ou malformados.
Testar Verificador de Cabeçalhos HTTPAdvertisement
Perguntas Frequentes
Significa que o Chrome recebeu uma resposta HTTP/2 que quebrou as regras do protocolo, por exemplo uma que terminou antes da hora, declarou o tamanho errado ou continha cabeçalhos proibidos, e por isso descartou a resposta. No Chromium, é o erro de rede -337.