Código de status HTTP · Erros do servidor (5xx)
Erro 505 HTTP Version Not Supported
O erro 505 HTTP Version Not Supported significa que o servidor não suporta, ou se recusa a suportar, a versão principal do HTTP usada no pedido. A causa mais comum é um cliente escrito à mão ou mal configurado colocando algo como HTTP/2.0 ou HTTP/0.9 numa linha de requisição HTTP/1.x.
| Classe | 5xx, Erros do servidor |
|---|---|
| Definido em | RFC 9110 §15.6.6 |
| Pode ir para o cache por padrão | Só com Cache-Control ou Expires explícitos |
| Pode repetir o pedido | Só com outra versão do HTTP, normalmente HTTP/1.1 |
| Cabeçalhos relevantes |
|
O que significa o 505
A RFC 9110, seção 15.6.6, diz que o 505 significa que o servidor não pode ou não quer concluir o pedido usando a mesma versão principal do cliente, e que a resposta deve explicar o motivo e quais protocolos ele suporta. Só a versão principal conta: um servidor HTTP/1.1 precisa aceitar pedidos HTTP/1.0.
O navegador praticamente nunca provoca esse erro, porque HTTP/2 e HTTP/3 são negociados no handshake TLS (ALPN), e não escritos numa linha de texto do pedido. Onde o 505 aparece é em clientes crus e scanners. O net/http do Go, por exemplo, responde 505 "unsupported protocol version" a qualquer linha que declare HTTP/0.x ou HTTP/2 em diante, exceto o prefácio de conexão do HTTP/2. Os balanceadores da AWS devolvem 505 quando um pedido HTTP/2 chega numa conexão estabelecida como HTTP/1.
Causas comuns
Se você está visitando o site
- Muito improvável num navegador comum. Se aparecer, um proxy antigo, extensão ou equipamento de rede do seu lado pode estar reescrevendo os pedidos.
Se você administra o servidor
- Um cliente ou script próprio escreve a linha do pedido à mão com a versão errada, como "HTTP/2.0" num socket TCP comum.
- Um proxy ou balanceador encaminha frames HTTP/2 para um backend que espera HTTP/1.1, ou o contrário.
- Um scanner de segurança testando versões obsoletas ou inventadas.
Como resolver
Se você está visitando o site
- Tente outro navegador ou outra rede, e desative extensões ou proxies que alteram o tráfego.
Se você administra o servidor
- Use uma biblioteca HTTP de verdade em vez de montar a linha do pedido à mão, e deixe ela negociar o HTTP/2 via ALPN.
- Confira a configuração de protocolo entre proxy e backend: por exemplo a versão de protocolo do target group num ALB da AWS, ou o proxy_http_version do nginx, que só fala HTTP/1.0 ou 1.1 com os upstreams.
Como diagnosticar o 505
O código da sua aplicação não envia 505; a biblioteca do servidor HTTP recusa a linha do pedido antes de qualquer handler rodar.
# Reproduce against a local Go server: HTTP/3.0 in an HTTP/1 request line
printf 'GET / HTTP/3.0\r\nHost: localhost\r\n\r\n' | nc localhost 8080
# HTTP/1.1 505 HTTP Version Not SupportedCostuma ser confundido com
- 505 vs 426
- O 426 Upgrade Required manda o cliente trocar de protocolo antes de tentar de novo; o 505 apenas recusa a versão que foi usada.
- 505 vs 400
- Uma versão que nem está bem formada, como "HTTP/um", normalmente recebe 400; o 505 é para uma versão válida que o servidor não aceita falar.
Perguntas frequentes
- O navegador pode receber erro 505?
- Na prática, não. O navegador negocia HTTP/2 e HTTP/3 via TLS (ALPN) e volta para HTTP/1.1 sem problema. Um 505 no navegador indica algo no meio do caminho, como um proxy com defeito, reescrevendo o pedido.
- Um servidor HTTP/1.1 precisa aceitar HTTP/1.0?
- Sim. A verificação do 505 vale só para a versão principal. Um servidor HTTP/1.1 tem que aceitar pedidos HTTP/1.0 e responder de um jeito que clientes HTTP/1.0 entendam.
- Como testar quais versões do HTTP um servidor suporta?
- Use o curl com --http1.1, --http2 ou --http3 e adicione -v para ver o que foi negociado. O curl mostra o protocolo na linha de status da resposta, como "HTTP/2 200".
Revisado em por Arielton Oberek.