Códigos de estado HTTP explicados: os que realmente se confundem
Publicado a 29/04/2026 · 8 min de leitura · Ferramentas para programadores
Daniel Okonkwo — Programador front-end e redator de Tecnologia na OneKitly
Desempenho web · Formatos de ficheiro
Verificado a partir de 2 fontes
O primeiro dígito é a parte que todos os clientes, caches e rastreadores leem: 1xx informativo, 2xx sucesso, 3xx redireção, 4xx a culpa foi do pedido, 5xx foi do servidor. Dentro disso, as distinções que mudam o comportamento são estas. 308 é um 301 com a garantia de que o método e o corpo sobrevivem à redireção, e 307 é um 302 com a mesma garantia — clientes antigos transformam um POST redirecionado em GET com 301 e 302, que é precisamente a razão de existirem 307 e 308. 401 significa que o pedido não trazia credenciais válidas e deve vir com um cabeçalho WWW-Authenticate; 403 significa que as credenciais estavam boas e a ação é recusada mesmo assim, pelo que voltar a entrar não ajuda. 404 diz que aqui não há nada sem se comprometer com o motivo; 410 diz que o recurso foi retirado de propósito e não volta, e é cacheável por omissão. Em 429 e 503, o Retry-After é uma estimativa que o servidor publica em segundos ou como data HTTP — uma orientação para clientes bem-comportados, não a promessa de regressar a horas.
301 contra 308, 302 contra 307, 401 contra 403, 404 contra 410 — e o que promete realmente o Retry-After num 429 ou num 503. Os pares em que escolher o código errado muda o comportamento, não apenas a redação.
O primeiro dígito é a única parte que alguns clientes leem
A RFC 9110 exige que um cliente compreenda a classe de um código de estado mesmo sem reconhecer o código em si, e que trate qualquer código desconhecido como o x00 da sua classe. Um cliente que nunca ouviu falar do 451 trata-o como um 400; um 599 desconhecido é tratado como um 500. É essa regra que torna o espaço extensível, e também significa que a classe carrega quase todo o comportamento: as caches decidem a partir dela se guardam, os proxies se repetem e os rastreadores se indexam, quase sempre antes de analisarem seja o que for do seu corpo de resposta.
A consequência prática é que devolver um 200 com o erro descrito no corpo coloca a falha onde mais nada a vê. A sua sonda de disponibilidade fica verde, o seu CDN guarda a página de erro em cache e um motor de busca indexa-a como um documento real. É o problema do soft 404 na sua forma geral, e vale a pena auditá-lo, porque a correção é uma linha no código de estado e não algo arquitetural.
Redireções: quais conservam o seu POST
A grelha dos quatro códigos de redireção cruza na verdade duas perguntas: permanente ou temporária, e o método sobrevive. 301 e 308 são permanentes, 302 e 307 temporárias; 307 e 308 são os dois que proíbem o cliente de alterar o pedido. A MDN é direta sobre a razão do par recente: o 301 já exigia que método e corpo ficassem inalterados, mas essa exigência era mal tratada pelos clientes antigos, que passavam a GET. Ninguém conseguia corrigir o parque instalado, por isso cunharam-se dois códigos novos com a garantia escrita na definição.
A escolha decorre portanto do tráfego. Para uma página que só recebe GET, o 301 serve e é aquilo a que os motores de busca estão mais habituados. Para um caminho de API, o destino de um formulário ou qualquer coisa que possa receber POST, PUT ou DELETE, use 308 e o pedido chega intacto. Um aviso sobre a permanência: os navegadores guardam um 301 em cache de forma agressiva e alguns mantêm-no muito mais tempo do que espera, pelo que um 301 emitido durante uma experiência pode sobreviver-lhe em máquinas a que não tem acesso. Sirva 302 ou 307 enquanto ainda decide.
Os erros mais vezes devolvidos de forma errada
401 e 403 são o par que mais tempo de suporte custa. O 401 significa que o pedido não trazia credenciais de autenticação válidas, e a MDN nota que é enviado com um cabeçalho WWW-Authenticate que descreve o esquema que o servidor espera — é um convite a tentar de novo com credenciais. O 403 é a situação oposta: as credenciais são perfeitamente válidas e o cliente continua sem permissão para esta ação. Devolver um 401 a um utilizador autenticado diz ao cliente dele para se reautenticar, o que produzirá exatamente a mesma recusa, e leva-o a pensar que a sessão está partida quando não está.
404 e 410 diferem apenas no grau de certeza, e é esse o ponto. A orientação da MDN é explícita: se quem opera o servidor não sabe se a condição é temporária ou permanente, deve usar 404. O 410 usa-se quando retirou a coisa de propósito e ela não volta — é cacheável por omissão e diz aos rastreadores para deixarem de perguntar. O Retry-After, por seu lado, é um cabeçalho que leva um atraso em segundos ou uma data HTTP; num 503 estima quanto tempo o serviço estará indisponível e num 429 indica quanto esperar antes de um novo pedido. É orientação, não contrato, e a MDN nota que o suporte entre clientes é desigual — mas o Googlebot respeita-o, o que já justifica defini-lo durante uma manutenção planeada.
| Código | Nome | A que o compromete | Onde falha |
|---|---|---|---|
| 200 | OK | O pedido teve êxito e o corpo é o resultado | Devolvido com uma mensagem de erro dentro do corpo, o que esconde a falha de caches, monitorização e rastreadores |
| 301 | Movido permanentemente | Este URL fica substituído de vez; atualize as suas ligações | Usado enquanto ainda se decide — os navegadores guardam-no com força em cache e clientes antigos transformam um POST redirecionado em GET |
| 302 | Encontrado | Vá aqui por agora; continue a usar o URL original | Usado para uma mudança permanente, pelo que o URL antigo continua a absorver os sinais de posicionamento |
| 304 | Não modificado | A sua cópia em cache continua válida; não há corpo | Enviado fora de um pedido condicional, ou com um corpo que os clientes podem descartar |
| 307 | Redireção temporária | Como 302, mas o método e o corpo não devem mudar | Pouco escolhido, pelo que as redireções temporárias quebram em silêncio os fluxos baseados em POST |
| 308 | Redireção permanente | Como 301, mas o método e o corpo não devem mudar | Esquecido nos pontos de API, onde um 301 rebaixa em silêncio um POST para GET |
| 401 | Não autenticado | Não foram apresentadas credenciais válidas; um cabeçalho WWW-Authenticate indica o que se espera | Devolvido a um utilizador já autenticado mas sem o direito — esse caso é 403 |
| 403 | Proibido | A identidade é aceite e a ação é recusada mesmo assim | Usado como saco de tudo, o que convida os clientes a repetir uma autenticação que nunca ajudará |
| 404 | Não encontrado | Não há nada neste URL e o servidor não diz se é definitivo | Substituído por uma página simpática servida com 200, o soft 404 que mantém indexados URLs mortos |
| 410 | Desaparecido | Retirado de propósito e não volta; cacheável por omissão | Quase nunca usado, mesmo quando a remoção foi intencional e o 404 fica aquém |
| 429 | Demasiados pedidos | Foi atingido um limite de taxa; o Retry-After indica quanto esperar antes de um novo pedido | Enviado sem Retry-After, deixando os clientes adivinhar e martelar o ponto de acesso |
| 500 | Erro interno do servidor | O servidor falhou e não tem nada mais específico a dizer | Devolvido por um pedido incorreto do cliente, que pertence antes à gama 400 |
| 502 | Gateway inválido | Um proxy recebeu uma resposta inválida do servidor a que reencaminhou | Depurado na aplicação, quando a falha está entre o proxy e o serviço de origem |
| 503 | Serviço indisponível | Temporariamente incapaz de servir; o Retry-After estima quanto durará a indisponibilidade | Substituído por um 500 durante manutenção planeada, pelo que os rastreadores tomam a paragem por uma falha real |
Perguntas frequentes
- Uma migração de site deve usar 301 ou 308?
- Para páginas que só são pedidas com GET, o 301 é o valor seguro e aquele que todos os rastreadores e proxies tratam há décadas. Recorra ao 308 em tudo o que possa receber POST, PUT ou DELETE — pontos de formulário, rotas de API, recetores de webhooks — porque é aí que um cliente a rebaixar o método em silêncio transforma uma redireção num corpo de pedido perdido. Nada impede usar ambos na mesma migração, rota a rota.
- O que deve uma API devolver quando a validação falha?
- Use 400 Bad Request quando o próprio pedido está malformado e o servidor não o consegue analisar — JSON partido, um cabeçalho obrigatório em falta. Use 422 Unprocessable Content quando a sintaxe está correta mas o conteúdo quebra as suas regras, como um corpo bem formado com uma data de fim anterior à de início. O que não deve devolver é um 500, que culpa o servidor por um erro do cliente e polui o seu orçamento de erros, nem um 200 com o problema descrito no corpo, que esconde a falha de todas as camadas entre si e quem chama.
- Os 404 prejudicam o posicionamento?
- Um 404 é uma resposta válida e honesta, e uma parte normal de qualquer site com algum tempo; uma página que já não existe deve dizê-lo. O dano vem dos substitutos. Um soft 404 — uma página simpática servida com estado 200 — mantém URLs mortos no índice e gasta orçamento de rastreio em nada. Redirecionar em bloco todas as páginas em falta para a homepage é o mesmo erro disfarçado de 301. Se a remoção foi deliberada e permanente, o 410 di-lo com clareza.
Artigos que podem interessar-lhe
Todos os guias →Ferramentas relacionadas
Fontes
Detetaste um erro neste artigo?