Web,ruby, Ajax ou qualquer outra coisa que me venha a cabeça (com prioridade para esta última)

29 outubro, 2005

410

Erro 410 HTTP: Deixei de estar acessível (fui eliminado ou não me querem dar acesso)

O erro 410 do protocolo HTTP é um afilhado do erro 404 (Recurso não encontrado). O erro 410 significa que o recurso deixou de ser acessível, ou seja, existia aqui um recurso neste local, mas deixou de existir. Não só deixou de existir, mas não sei (ou não lhe quero dizer) para onde foi. Se soubesse e lhe quisesse dizer, então utilizaria o erro 301 (redirecionamento permanente) e qualquer cliente inteligente simplesmente apontava para o novo endereço. Mas o erro 410 significa que o recurso desapareceu e não há endereço de reendereçamento.

Não há assim tanta informação sobre o erro 410 facilmente disponível. Se efectuar uma busca no Google pelo erro 410 vai encontrar uma série de páginas onde o erro foi gerado. Há poucas páginas que dão uma pequena descrição do erro mas visto esta condição não ser muito frequente (ou não ser usada com frequência) pouco mais é dito. Além disso parece que todos tivemos uma lavagem ao cérebro acreditando que todos os recursos devem ser permanentes o que não é verdade.

Usar o erro código 410 do HTTP significa aceitar a temporalidade de todas as coisas.

Passemos pois à implementação. Lendo a documentação do Apache, encontram-se várias formas de especificar que um recurso desapareceu. O primeiro usa «Redirect»:


    Redirect gone /caminho/para/recurso
    

Por exemplo se criar uma página temporária:


    http://aindaapensar.cafonso.pt/tmp/imagem.png
    

(*este recurso não existe de qualquer forma) e queira maisd tarde apagar esse ficheiro por qualquer razão devo colocar no ficheiro .htaccess:


 Redirect gone /tmp/imagem.png

O caminho é um caminho virtual do recurso no meu servidor, não o nome completo do ficheiro no disco, e também não o URL completo.

Pode ainda usar RedirectMatch para vários ficheiros, usando expressões regulares. Por exemplo, isto iria corresponder a todos os ficheiros na pasta tmp/ com a extensão .png:

RedirectMatch gone /tmp/*.png

A terceira opção seria usar mod_rewrite, o que permite condicionais complexos para decidir quando servir um erro 410. Por exemplo tenho uma edição móvel que contém uma página de índice e páginas dos cinco artigos mais recentes simplificadas. Estes artigos não devem ser permanentes. Tudo funciona como se fosse um RSS feed, com a excepção de que é repartido por várias páginas devido ao que é esperado pelos dispositivos móveis. Cada página tem o seu endereço próprio, mas têm vida curta. Também não posso usar os mesmos URLs sucessivas vezes como por exemplo colocar os artigos em /movel/1 até /movel/5 pois tal poderia confundir alguns proxies.

Assim quando os artigos deixarem de figurar na página de índice eu elimino-os do meu servidor e desejo servir um código apropriado de erro para proxies e bots que apareçam mais tarde. Pelo que lhes posso dizer o erro 410 é o código de erro perfeito para isso. Não desejo manter de forma manuak uma lista de regras de Redirect (redireccionamento) e assim uso o mod_rewrite:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule movel/[0-9]{6}.html$ - [G,L]

Em português isto quer dizer:

  1. Se houver um pedido para um ficheiro que não exista (!-f)
  2. e o ficheiro estiver na pasta móvel e for identificado por qualquer dos seis algarismos + .html (é a expressão regular)
  3. então usar o código de erro 410 (indicador G)
  4. e retornar imediatamente sem demora adicional (indicador L).

Isto não é uma solução perfeita: se indicar um URL arbitrário de páginas que nunca existiram mas que correspondem ao padrão, irá obter um erro 410 em vez do mais correcto 404. Mas cobre os casos mais prováveis de um proxy ou motor de busca voltar e pedir um recurso que anteriormente tiver apanhado e descobrir que já não existe.

Contudo podemos usar métodos para determinar se houve em algum momento determinado ficheiro (usando uma base de dados/tabela sendo considerado apagado quando a tabela assim o indicasse (de forma deirecta ou indirecta) ou em vez de apagar um ficheiro passar o seu tamanho para zero e assim o erro seria reportado quando o ficheiro tivesse zero bytes). Claro que se podia criar ainda outras regras que permitissem determinar facilmente se um ficheiro poderia já ter existido (por exemplo ficheiros com nomes crescentes).

Quando um user agent pede uma página que tenha marcado com um código 410 o Apache gera uma página de erro por omissão que se parece com:

    Morreu

    O recurso pedido
    /caminho/para/recurso/pedido
    não está mais disponível neste servidor e não há endereço de reencaminhamento. Por favor remova todas as referência para este recurso.

…que está muito bem, excepto quanto a razões estéticas tal como a página por omissão do erro 404. Recurso não encontrado. Mas pode criar uma página 410 à sua medida tal como pode criar páginas de erro à medida para outras condições usando uma directiva de ErrorDocument no seu ficheiro .htaccess:


    ErrorDocument 410 /caminho/para/página/àmedida

Trata-se novamente de um caminho virtual no seu servidor, o qual pode ser o endereço web sem domínio. (Pode ainda ser um URL completo numa máquina remota, mas nesse caso o "user agent" não iria receber um erro 410; iria receber um estado de reencaminhamento em seu lugar. Por isso talvez seja melhor manter a resposta local, de forma a ser emitido o código adequado.

Outros usos possíveis para o erro código 410:

  • Páginas temporárias
  • Posts de blogues apagados
  • Experiências num servidor que oferece hospedagem gratuita por determinado período após expiração do mesmo sem pagamento pelo utilizador pela continuação
  • Sítios de utilizadores que deixem de pertencer a uma comunidade online
  • ...

Não é um erro frequente, e não tenho a certeza de estar a usar isto de forma correcta.

Para quem queira avaliar por si poderá por exemplo consultar o RFC2616.

2 comentários:

Unknown disse...

Oi Cafonso,
estou com um problema em uma página que tem o erro 410. Você poderia me ajudar a resolver. Grata, Fernanda

Carlos Afonso disse...

Se percebo o seu problema é não aceder a uma página que deixou de existir. Se for esse o caso não me parece que a possa auxiliar.

Em qualquer caso com a informação que me presta não posso de facto tirar qualquer conclusão (ia escrever um pleonasmo definitiva).

Pode comentar novamente com um pouco de informação adicional.