Códigos de Retorno HTTP

Artigo que apresenta os códigos de retorno HTTP, definido pela RFC 2616. Cita os principais, seus impactos em SEO e a utilização com PHP.

Introdução

A Internet é suportada pelo protocolo HTTP, em que um cliente solicita um pedido ao servidor e este retorna um resultado. Este resultado deve sempre vir com um código numérico e, opcionalmente, algum conteúdo extra (como exemplo: podem ser instruções no cabeçalho do pacote de resposta, como uma solicitação para o cliente redirecionar para outro arquivo, ou o conteúdo de um arquivo HTML para ser renderizado no cliente).

É importante conhecer os principais códigos HTTP e utilizá-los da maneira correta, pois eles podem afetar a reputação de seu site.


O formato dos códigos de retorno HTTP

Os códigos de retorno HTTP são números com 3 dígitos que possuem um formato que auxilia na identificação do tipo de retorno. Os formatos e os respectivos tipos de retorno são:

  • 1xx (códigos iniciados em "1") - Resultados Informativos
  • 2xx (códigos iniciados em "2") - Resultados de Sucesso
  • 3xx (códigos iniciados em "3") - Instruções de Redirecionamento
  • 4xx (códigos iniciados em "4") - Resultados de Erro do Cliente
  • 5xx (códigos iniciados em "5") - Resultados de Erro do Servidor

A lista completa de códigos de retorno HTTP pode ser obtida no site do W3C: Status Code Definitions.


Principais códigos de retorno HTTP

Embora existam muitos códigos de retorno, você provavelmente não precisará utilizar ou conhecer todos a fundo. Alguns deles são utilizados pelo próprio servidor HTTP (como o Apache), quando encontra algumas situações. Por exemplo, se você tem um site e solicita ao servidor um arquivo inexistênte (e não possui regras de reescrita de url para fazer urls amigáveis), o próprio servidor retorna o código 404, indicando página não encontrada.

Os principais códigos de retorno HTTP que você deve conhecer e seus respectivos significados são:

  • 200 - Código de sucesso. Normalmente é retornado automaticamente pelo servidor HTTP ao encontrar o arquivo ou processar um script PHP que não possui instruções que modificam o código de retorno HTTP.
  • 301 - Conteúdo movido permanentemente. É usado quando um documento mudou de lugar (físico ou virtual), ou seja, a forma de acessá-lo passou a ser outra permanentemente. Isso significa que a URL não é mais válida (não existe mais documento naquela URL) e deve ser utilizada a nova URL para acesso.
  • 307 - Conteúdo temporariamente redirecionado. É usado pelos "redirects" simples (quando se utiliza a diretiva HTTP "Location" no PHP). Isso significa que a URL acessada é a que deverá continuar sendo acessada, mas o cliente deve seguir para outra URL provisoriamente.
  • 404 - Conteúdo não encontrado. Deve ser usado quando a URL solicitada não representa um documento existente.
  • 500 - Erro interno do servidor. Normalmente é retornado automaticamente por alguns servidores HTTP, quando ocorre algum erro inesperado do servidor.
  • 503 - Serviço temporariamente indisponível. Deve ser usado quando o servidor está muito sobrecarregado ou quando o servidor está em manutenção. Significa que o documento existe, mas que não é o retornado naquele momento.

A influência dos códigos de retorno HTTP sobre os buscadores

Agora que vimos alguns códigos de retorno HTTP importantes, precisamos conhecer em que eles influenciam os buscadores como o Google. Aliás, o próprio Google tem um documento que fala sobre isso em HTTP status codes.

Código 404

O código 404 deve ser retornado pelo servidor HTTP quando a URL solicitada não existe e, portanto, não deve ser indexada. Então se você tem um site com muito conteúdo, mas pretende mudar a forma como eles são acessados, ou seja, mudar a URL (seja o domínio, ou o path, query string, etc.) então é importante que você utilize o código 301 para que o cliente que acessar um documento pela URL antiga seja redirecionado para a URL nova. Isso vale para os robôs de busca, ou seja, você informa que a URL mudou permanentemente. Isso evita que todo seu conteúdo seja "desindexado", ou perca relevância anteriormente conquistada.

Se o seu código PHP entrou em alguma exceção, erro fatal, ou algo do gênero, você não deve retornar o código 404, pois o documento existe, só não pode ser retornado adequadamente devido a um problema provavelmente temporário. Neste caso, o ideal é usar o código 503, indicando que o serviço está temporariamente indisponível.

Código 200

O código 200 deve ser retornado pelo servidor HTTP quando a URL solicitada existe e está disponível para ser entregue corretamente. Isso não significa que o documento será indexado pelos robôs de busca, já que estes podem verificar o valor da meta tag "robots" para determinar se devem ou não indexar o documento.

Código 503

O código 503 deve ser retornado pelo servidor HTTP quando a URL solicitada existe, mas não está disponível para ser entregue. Por exemplo, se o site está em manutenção ou está sobrecarregado. Com isso, você pode exibir uma mensagem explicando a situação ao usuário, mas esta mensagem não será indexada pelos robôs de busca. Quando os robôs de busca acessam uma URL e recebem este código eles apenas desconsideram o documento apresentado e continuam com o documento que estava indexado da forma que estava.


Modificando o código de retorno HTTP pelo PHP

Em PHP, a função header é usada para definir diretivas do cabeçalho do pacote HTTP que será devolvido ao cliente. Por esta função, é possível modificar o código de retorno HTTP, conforme o exemplo:

// Realizando um redirecionamento permanente
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.teste.com.br/outro_script.php');
exit(0);

Ou seja, o conteúdo passado para a função deve começar com "HTTP/", seguido da versão do protocolo HTTP utilizado, seguido do código de retorno HTTP e seguido da mensagem humana para o código de retorno.

A partir do PHP 5.4.0, existe uma função mais conveniente e prática para este propósito, que é a http_response_code. Veja como fica o exemplo anterior:

// Realizando um redirecionamento permanente
http_response_code(301);
header('Location: http://www.teste.com.br/outro_script.php');
exit(0);

4 comentários

Diego Henrique Oliveira disse...

Um código importante também é o 400. Ele não é muito usado mas deveria. Por exemplo, um formulário enviado com dados incorretos deve retornar 400 como código de retorno (lembrando que código de retorno != conteudo de retorno).

:)

rubS (autor do blog) disse...

Olá Diego,

Obrigado pela contribuição, embora eu discorde da sua colocação. Observando a descrição do código 400, diz o seguinte:

"The request could not be understood by the server due to malformed syntax"

PT-BR: "A requisição não pôde ser compreendida pelo servidor devido a problemas de sintaxe"

Ou seja, este código deve ser retornado quando a requisição HTTP estiver com algum erro de sintaxe e não quando o cliente da aplicação digitou algo errado.

É preciso separar o que é cliente da aplicação (usuário que loga no sistema e realiza operações nele) do cliente web (que é normalmente o navegador web trocando pacotes de dados com o servidor).

Numa aplicação web, normalmente os dados enviados do cliente para o servidor são feitos pelo navegador web, que procura seguir a risca a sintaxe do protocolo. Porém, quando há interação entre scripts, diretamente via socket, pode ser que o script envie uma solicitação HTTP incorreta, como no exemplo abaixo:

GET /index.php HTTP\1.1
Host: rubsphp.blogspot.com.br

Observe que o HTTP\1.1 está com a barra invertida. Deveria ser HTTP/1.1. Com isso, o próprio servidor apache já te retorna o código 400.

Aline Michele disse...

Gostaria de saber se esses códigos influenciam diretamente nas portas de uma host... ?
Se o servidor responder com o código 200 isso significa que terei alguma porta aberta, a 80 por exemplo? Uso métodos VPN por isso quero tirar essa dúvida. Desde já. . Obrigada!

Rubens Takiguti Ribeiro (autor do blog) disse...

Aline, se você realizar uma requisição HTTP na porta 80 de um servidor e ele devolver uma resposta HTTP (independente do código), quer dizer que há um servidor Web alí respondendo. Portanto, a porta 80 está aberta. Não conheço tanto de VPN, mas no meu entendimento, se você está conectada a uma VPN e faz a requisição que recebe uma resposta, então a porta está liberada para aquela VPN, mas não necessariamente a rede externa.