Códigos de status HTTP

Referência completa dos códigos de status de resposta HTTP com explicações e casos de uso.

Categorias de códigos de status HTTP

Qual a diferença entre 301 e 302 ?

301 Moved Permanently indica aos clientes que o recurso foi movido definitivamente · os motores de busca transferem o ranking. 302 Found é um redirecionamento temporário · a URL original mantém seu ranking.

Quando usar 401 em vez de 403 ?

401 Unauthorized significa « não autenticado » · o cliente deve fornecer credenciais. 403 Forbidden significa « autenticado mas não autorizado » · as credenciais não farão diferença.

O que significa o código de status 418 ?

418 « I'm a teapot » é uma piada de 1º de abril da RFC 2324 (Hyper Text Coffee Pot Control Protocol). Não é usado na prática, mas é muito conhecido na cultura dos desenvolvedores.

Um padrão com três décadas de desvio

Os códigos de status HTTP passaram por várias gerações de especificação. A RFC 1945 (maio de 1996) padronizou o HTTP/1.0 com as categorias básicas 1xx-5xx. A RFC 2616 (junho de 1999) trouxe o HTTP/1.1 e foi a referência canônica por mais de uma década. A série 7230-7235 (junho de 2014) dividiu o HTTP/1.1 em várias especificações por tópico. O padrão consolidado atual é a RFC 9110 «HTTP Semantics» (junho de 2022), que torna obsoleta a divisão 7230-7235 e é a citação certa para o trabalho moderno. O registro completo e ativo dos códigos atribuídos fica no registro de códigos de status HTTP da IANA.

As cinco categorias num relance

As comparações «vs.» que confundem todo mundo

401 vs. 403. O par mais confundido de todos. 401 Unauthorized significa «você não se autenticou, tente fazer login» (o nome é tecnicamente enganoso: é sobre autenticação, não autorização). 403 Forbidden significa «você está autenticado, mas não tem permissão para fazer isto»: suas credenciais são válidas, mas não concedem acesso a este recurso. Um uso incorreto comum: retornar 403 para requisições não autenticadas quando o correto é 401 com um cabeçalho WWW-Authenticate.

301 vs. 302 vs. 307 vs. 308. Dois eixos, permanente vs. temporário, e o comportamento de preservação de método:

CódigoPermanente?Método preservado?Sinal de ranking de SEO
301 Moved PermanentlySimHistoricamente, os clientes mudavam POST → GETPermanente, passa o ranking para a nova URL
302 FoundNãoHistoricamente, os clientes mudavam POST → GETTemporário, a URL original mantém o ranking
307 Temporary RedirectNãoEstrito, POST continua POSTIgual ao 302
308 Permanent RedirectSimEstrito, POST continua POSTIgual ao 301

Se você está redirecionando requisições GET para fins de SEO, o 301 é a escolha convencional. Se você está redirecionando requisições POST ou PUT e quer o método preservado, precisa do 307 ou do 308.

400 vs. 422. O 400 Bad Request é para requisições sintaticamente malformadas: JSON inválido, cabeçalhos obrigatórios ausentes, parâmetros de consulta malformados. O 422 Unprocessable Entity (originalmente um código do WebDAV, amplamente adotado por APIs REST) é para requisições sintaticamente válidas com problemas semânticos: o JSON é analisado corretamente, mas os valores falham na validação de negócio (quantidade negativa em um pedido, e-mail já em uso). Muitas APIs usam os dois.

502 vs. 503 vs. 504. Três modos diferentes de falha de upstream:

404 vs. 410. O 404 Not Found é «não sabemos se isto existe ou não.» O 410 Gone é «isto já existiu, foi removido permanentemente.» Impacto no SEO: o Google trata o 410 como um sinal mais forte de que o conteúdo está permanentemente indisponível e o remove do índice mais rápido do que faz com o 404.

Convenções de API REST

As APIs REST modernas convergiram para um conjunto bastante consistente de convenções sobre o que os códigos de status significam para cada ação:

MétodoCaminho felizErros comuns
GET200 OK com corpo, ou 304 Not Modified se em cache404 se o recurso não existe, 403 se proibido
POST (criar)201 Created com cabeçalho Location apontando para o novo recurso400 para corpo malformado, 422 para erros de validação, 409 para conflitos
PUT (substituir) / PATCH (atualizar)200 OK com o corpo atualizado, ou 204 No Content404 se o recurso não existe, 409 para conflitos de versão
DELETE204 No Content (ou 200 com confirmação de exclusão)404 se não existe
Qualquer um (com limite de taxa)-429 Too Many Requests com cabeçalho Retry-After
Qualquer um (autenticação)-401 se não há autenticação, 403 se autenticado mas sem permissão

Implicações de SEO

Códigos famosos e culturais

Erros comuns

  1. Usar 200 OK para erros com um corpo de erro. Retornar {"error": "not found"} com um status 200 confunde toda camada de cache, ferramenta de monitoramento e SDK de cliente. Use o código de status certo.
  2. Retornar 403 para requisições não autenticadas. O código certo é 401 com um cabeçalho WWW-Authenticate.
  3. Usar 302 quando você quer dizer 301. Se a mudança é permanente, os motores de busca precisam do 301 para transferir o ranking. O 302 mantém a URL antiga indexada.
  4. Usar 301 ou 302 para redirecionamentos de POST/PUT. Historicamente, esses permitiam aos clientes mudar o método para GET. O 307 e o 308 preservam estritamente o método original.
  5. Retornar 500 quando se quer dizer 503. Se o servidor está sobrecarregado ou em manutenção, 503 com Retry-After é o sinal correto, tanto para os clientes quanto para o Googlebot.
  6. Usar 404 para páginas removidas permanentemente. O 410 Gone é o sinal mais forte e é removido dos índices dos motores de busca mais rápido.
  7. Esquecer o cabeçalho Location em respostas 201 e 3xx. O cabeçalho Location é o que diz ao cliente onde o novo recurso fica ou para onde redirecionar. Sem ele, os clientes não conseguem navegar.

Mais perguntas frequentes

Quando devo retornar 422 em vez de 400?

O 400 Bad Request significa que a própria requisição está malformada: JSON inválido, cabeçalhos obrigatórios ausentes, parâmetros de consulta malformados. O 422 Unprocessable Entity significa que a requisição está bem-formada, mas contém erros semânticos que impedem o processamento: um campo de quantidade definido como um número negativo, um endereço de e-mail que já está em uso, uma data no passado para um campo que só aceita o futuro. As convenções modernas de API REST convergiram para essa divisão, com a maioria das grandes APIs (GitHub, Stripe, Twilio) usando o 422 para erros de validação.

Por que a Cloudflare às vezes retorna 520, 521, 522…?

Os códigos 520-527 são específicos da Cloudflare, sinalizando diferentes formas pelas quais a borda deles não conseguiu alcançar seu servidor de origem. O 520 é o genérico «o servidor web retornou um erro desconhecido»; o 521 significa que a sua origem recusou a conexão; o 522 é um tempo limite de conexão com a sua origem; o 524 significa que a sua origem demorou demais para responder. Eles não estão no registro da IANA, mas são amplamente encontrados quando sites atrás da Cloudflare têm problemas de backend.

Meu navegador vai me mostrar qual código a minha API retornou?

Sim, abra o DevTools → aba Network, clique na requisição e olhe a coluna «Status». Os navegadores também exibem páginas genéricas para alguns códigos (o jogo do dinossauro nas falhas de conexão do Chrome, as páginas 404 / 500 padrão); mas o código numérico real está sempre na resposta.

O que é o 103 Early Hints?

Um código 1xx relativamente novo (RFC 8297, 2017) que permite ao servidor enviar cabeçalhos Link: rel=preload antes de a resposta completa estar pronta, dizendo ao navegador para começar a buscar recursos críticos (CSS, fontes, imagens) cedo. Agora é suportado pelo Chrome e entregue pela Cloudflare, Fastly e outras CDNs como uma otimização de desempenho.

Posso inventar meu próprio código de status?

Tecnicamente sim (o HTTP permite qualquer código de 3 dígitos na faixa 100-599). Na prática, não: clientes, proxies e caches tratam códigos desconhecidos pelo primeiro dígito (então 4xx = erro do cliente, de forma genérica, 5xx = erro do servidor). Alguns fornecedores fazem isso (os 520 da Cloudflare, o 444 do Nginx), mas, a menos que você controle as duas pontas da conexão, limite-se ao registro da IANA. Inventar um 299 não vai quebrar nada, mas também não vai comunicar coisa alguma.

Por que o «código de status» se chama «status» e não «código de erro»?

Porque a maioria deles não são erros. O 200 OK é o código de status mais retornado do mundo: significa «tudo correu bem.» Os códigos comunicam o status da requisição: sucesso, redirecionamento, erro do cliente, erro do servidor. Chamá-los de «códigos de erro» tende para os casos negativos que são registrados e notados; os códigos de sucesso fazem seu trabalho silenciosamente a cada microssegundo.

Ferramentas relacionadas

Analisador e decodificador de URL Gerador .htaccess Codificador / Decodificador URL gratuito